Python:json库中的编码问题
博客专区 > 樂天 的博客 > 博客详情
Python:json库中的编码问题
樂天 发表于4年前
Python:json库中的编码问题
  • 发表于 4年前
  • 阅读 81
  • 收藏 0
  • 点赞 0
  • 评论 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字符。





  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 133
博文 668
码字总数 147068
作品 3
×
樂天
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: