使用Python的json.loads解析Unicode输入

21 投票
4 回答
63729 浏览
提问于 2025-04-15 19:05

在Python中加载JSON字符串的最佳方法是什么?

我想用json.loads来处理像这样的unicode:

import json
json.loads(unicode_string_to_load)

我还尝试过给'encoding'参数设置为'utf-16',但是错误依然存在。

完整的示例代码和错误信息:

# -*- coding: utf-8 -*-
import json
value = '{"foo" : "bar"}'
print(json.loads(value)['foo'])     #This is correct, prints 'bar'

some_unicode = unicode("degradé")  
#last character is latin e with acute "\xe3\xa9"
value = '{"foo" : "' + some_unicode + '"}'
print(json.loads(value)['foo'])            #incorrect, throws error

错误信息:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 
6: ordinal not in range(128)

4 个回答

6

我找到的最简单的方法是

import simplejson as json

这样你的代码就保持不变了

json.loads(str_to_load)

参考链接: https://simplejson.readthedocs.org/en/latest/

6

提问者在评论中澄清了……:

源数据是一个很大的 Unicode 编码字符串。

那么你需要知道它使用的是哪种 Unicode 编码——显然不是 'utf-16',因为那种编码失败了,但还有很多其他的编码,比如 'utf-8'、'iso-8859-15' 等等。你可以尝试所有的编码,直到找到一个能用的,或者用 print repr(str_to_load[:80]) 这段代码,看看前80个字符是什么,然后把结果粘贴到你的问题里,这样我们就可以帮你猜测了!-)

12

我把字符串转换成了unicode字符串,使用了'latin-1',这样就解决了错误:

UnicodeDecodeError: 'utf16' codec can't decode byte 0x38 in 
position 6: truncated data

修复后的代码:

import json

ustr_to_load = unicode(str_to_load, 'latin-1')

json.loads(ustr_to_load)

然后就不再出现错误了。

撰写回答