我有一个非常简单的json,无法使用simplejson模块进行解析。再生产:
import simplejson as json json.loads(r'{"translatedatt1":"Vari\351es"}')
结果:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/pymodules/python2.5/simplejson/__init__.py", line 307, in loads return _default_decoder.decode(s) File "/usr/lib/pymodules/python2.5/simplejson/decoder.py", line 335, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib/pymodules/python2.5/simplejson/decoder.py", line 351, in raw_decode obj, end = self.scan_once(s, idx) ValueError: Invalid \escape: line 1 column 23 (char 23)
任何人都知道出了什么问题以及如何正确解析上面的json吗?
在那里编码的字符串是: Variées
PS我使用python 2.5
非常感谢!
那是完全正确的;Vari\351es包含无效的转义符,JSON标准不允许\后面跟数字。
Vari\351es
\
无论产生什么代码,都应该修复。如果那是不可能的,那么您将需要使用正则表达式删除这些转义符,或者将其替换为有效的转义符。
如果我们将351数字解释为八进制数字,则它将指向Unicode代码点U + 00E9,即é字符(带有ACUTE的拉丁文小写字母E)。您可以使用以下方法“修复” JSON输入:
351
é
import re invalid_escape = re.compile(r'\\[0-7]{1,6}') # up to 6 digits for codepoints up to FFFF def replace_with_codepoint(match): return unichr(int(match.group(0)[1:], 8)) def repair(brokenjson): return invalid_escape.sub(replace_with_codepoint, brokenjson)
使用repair()您的示例可以加载:
repair()
>>> json.loads(repair(r'{"translatedatt1":"Vari\351es"}')) {u'translatedatt1': u'Vari\xe9es'}
您可能需要调整代码点的解释。我选择八进制(因为它Variées是一个实际的单词),但是您需要使用其他代码点对其进行更多测试。
Variées