文档章节

Python:json库中的编码问题

樂天
 樂天
发布于 2014/05/30 10:07
字数 507
阅读 84
收藏 0
https://docs.python.org/2/library/json.html下有一个默认的转换表:


#-*-encoding:utf-8-*-
import json

d = {'info':'你好,world', 'isChecked':True}
print d
j = json.dumps(d)
print j


输出为:

{'info': '\xe4\xbd\xa0\xe5\xa5\xbd,world', 'isChecked': True}
{"info": "\u4f60\u597d,world", "isChecked": true}

第一行输出字典变量d时,"你好"显示为utf-8编码,第二行输出中"你好"显示为unicode编码。第二行输出是一个字符串,所以肯定是希望其输出“正常点”,于是可以这样做:

#-*-encoding:utf-8-*-
import json

d = {'info':'你好,world', 'isChecked':True}
print d
j = json.dumps(d, ensure_ascii=False)
print j
运行后输出如下:
{'info': '\xe4\xbd\xa0\xe5\xa5\xbd,world', 'isChecked': True}
{"info": "你好,world", "isChecked": true}
好了,正常了。

然后试一下将json字符串转换为python对象:
#-*-encoding:utf-8-*-
import json

d = {'info':'你好,world', 'isChecked':True}
print d
j = json.dumps(d, ensure_ascii=False)
print j

d2 = json.loads(j) ##或者d2 = json.loads(j, encoding='utf-8') 
print d2
注意,如果字符串j编码不是utf-8或者unicode,用在loads函数中encoding指定j的编码。
输出如下:
{'info': '\xe4\xbd\xa0\xe5\xa5\xbd,world', 'isChecked': True}
{"info": "你好,world", "isChecked": true}
{u'info': u'\u4f60\u597d,world', u'isChecked': True}


d2是转换后的字典,可以看到"你好"被转换成了unicode形式,而非utf-8,同时连“键”也被转换为了unicode。

由json字符串转换为python对象,处理python对象时候要注意编码问题,比如:

#-*-encoding:utf-8-*-
import json

d = {'info':'你好,world', 'isChecked':True, '姓名':'樂天'}
print d
j = json.dumps(d, ensure_ascii=False)
print j

d2 = json.loads(unicode(j))     
print d2
print d2['info'] # 正常
print d2[u'info']  # 正常
print d2['姓名']  # 报错
print d2[u'姓名']  # 正常




如果要把"你好"转换为utf-8,可以这样做:
d2['info'] = d2['info'].encode('utf-8')
print d2


输出结果是:
{u'info': '\xe4\xbd\xa0\xe5\xa5\xbd,world', u'isChecked': True}


可惜还和最初的样子不一样。

其中一个解决方法是自己写一个递归函数将这个完全unicode化的dict转换为utf8形式。
另外一种就是将就着用,键不推荐使用非ASCII字符。





© 著作权归作者所有

共有 人打赏支持
樂天
粉丝 135
博文 673
码字总数 147433
作品 3
深圳
程序员
python处理json数据中文

(python http://www.jbxue.com/jb/python)处理json数据中的中文问题。 python中自带了处理python的模块,使用时候直接import json即可。 使用loads方法即可将json字符串转换成python对象,对...

mysoftsky
2014/03/06
0
0
python序列化数据本地存放

深入# 序列化的概念很简单。内存里面有一个数据结构,你希望将它保存下来,重 用,或者发送给其他人。你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出的...

临峰不畏
2015/01/18
0
0
应该学习最新版本的 Python 3 还是旧版本的 Python 2?

应该学习最新版本的 Python 3 还是旧版本的 Python 2? 看到最新Python版本是3.4,但是网上的资料,包括出版的书籍,都是最晚到13年左右,很多细节都不同,语法也过时了。 那此时应该直接学习...

Airship
2015/11/12
0
0
深入了解Python与黑客的关系,另赠Python黑客视频教程!

网络爱好者总是要掌握编程语言的,这里推荐:python。下面,一文了解黑客们会用到哪些Python技术!尾部免费送教程! 1、为什么是python Python已经成为漏洞开发领域的行业标准,读者会发现大...

Python新世界
07/27
0
0
Python基础——内置hashlib、IO、Json、codecs模块(0426)

一、hashlib 加密模块:提供了很多加密的算法 常见的加密方式:MD5 RSA,加密之后不可逆。没法破解。 1、以MD5的方式加密字符串(Python 3) 示例 结果 2、以MD5的方式加密字符串(Python 2)...

python初雪之路
04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

阿里云API网关使用教程

API 网关(API Gateway)提供高性能、高可用的 API 托管服务,帮助用户对外开放其部署在 ECS、容器服务等阿里云产品上的应用,提供完整的 API 发布、管理、维护生命周期管理。用户只需进行简...

mcy0425
29分钟前
4
0
解决远程登陆误按ctrl+s锁屏假死恢复

使用putty时,偶尔发生屏幕假死,不能输入等情况。 后来发现,只要数据ctrl+s,就会假死;输入ctrl+q就可以恢复过来。 很多刚从windows转移到linux上来工作的朋友,在用vi/vim编辑文件时,常常...

HJCui
32分钟前
0
0
@Transactional

事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于...

asdf08442a
36分钟前
2
0
widows下强制解除8080端口占用问题

使用win+R打开命令窗口 输入以下命令查看哪个任务占用了8080端口 netstat -ano |findstr "8080" 然后通过任务id强制关闭占用该端口的进程 tskill 10044 // 自己的试情况而定,这个ID是LISTE...

_Artisan
46分钟前
2
0
productFlavors简单实用

最近项目中,不同环境需要配置的参数越来越多,为了减少修改代码次数。研究了一下productFlavors的使用方式,总结如下 1. as3.0以上版本使用productFlavors时需要指定一个flavorDimensions,...

火云
48分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部