解决Python 2下的json.loads()导致的unicode编码问题

python 2下使用json.loads往往会导致最终的结果编码是unicode,并不是我们想要的str型,如下所示:

test = {"name": "扎克伯格", "age":18}
print test
test_json = json.dumps(test, ensure_ascii=False)
print test_json
test1 = json.loads(test_json)
print test1

运行的结果是:

{'age': 18, 'name': '\xe6\x89\x8e\xe5\x85\x8b\xe4\xbc\xaf\xe6\xa0\xbc'}
{"age": 18, "name": "扎克伯格"}
{u'age': 18, u'name': u'\u624e\u514b\u4f2f\u683c'}

 

由于json.loads()使用较多的场景就是在网络请求中,网上找了很多方案都不行,最后找到一个可行的方案,那就是通过对转换后的字典进行遍历实现一步步的编码就可以了。因此我们可以自己写一个转换函数来专门针对这个unicode编码的问题。

转换函数的代码如下:

def unicode_convert(input):
    if isinstance(input, dict):
        return {unicode_convert(key): unicode_convert(value) for key, value in input.iteritems()}
    elif isinstance(input, list):
        return [unicode_convert(element) for element in input]
    elif isinstance(input, unicode):
        return input.encode('utf-8')
    else:
        return input

 

然后再来测试一下效果:

test = {"name": "扎克伯格", "age":18}
print test
test_json = json.dumps(test, ensure_ascii=False)
print test_json
test1 = json.loads(test_json)
print test1
test2 = unicode_convert(json.loads(test_json))
print test2

打印的结果是:

{'age': 18, 'name': '\xe6\x89\x8e\xe5\x85\x8b\xe4\xbc\xaf\xe6\xa0\xbc'}
{"age": 18, "name": "扎克伯格"}
{u'age': 18, u'name': u'\u624e\u514b\u4f2f\u683c'}
{'age': 18, 'name': '\xe6\x89\x8e\xe5\x85\x8b\xe4\xbc\xaf\xe6\xa0\xbc'}

符合原来的预期,问题解决(因为python控制台打印的字典中的中文会出现unicode,这个并不影响)

你可能感兴趣的:(解决Python 2下的json.loads()导致的unicode编码问题)