Python:json库中的编码问题

在 https://docs.python.org/2/library/json.html下有一个默认的转换表:
Python:json库中的编码问题

#-*-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字符。





你可能感兴趣的:(Python:json库中的编码问题)