die*_*cht 3 python json simplejson
我有一个非常简单的json我无法用simplejson模块解析.再生产:
import simplejson as json
json.loads(r'{"translatedatt1":"Vari\351es"}')
Run Code Online (Sandbox Code Playgroud)
结果:
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)
Run Code Online (Sandbox Code Playgroud)
任何人都知道什么是错的,以及如何正确解析上面的json?
在那里编码的字符串是:Variées
PS我使用python 2.5
非常感谢!
那是完全正确的; Vari\351es包含无效的转义,JSON标准不允许\后跟只是数字.
无论生成什么代码都应该修复.如果这是不可能的,您将需要使用正则表达式来删除这些转义,或用有效的转义替换它们.
如果我们将351数字解释为八进制数,那将指向unicode代码点U + 00E9,即é字符(LATIN SMALL LETTER E WITH ACUTE).您可以使用以下方法"修复"您的JSON输入:
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)
Run Code Online (Sandbox Code Playgroud)
使用repair()您的示例可以加载:
>>> json.loads(repair(r'{"translatedatt1":"Vari\351es"}'))
{u'translatedatt1': u'Vari\xe9es'}
Run Code Online (Sandbox Code Playgroud)
您可能需要调整代码点的解释; 我选择八进制(因为它Variées是一个实际的单词),但您需要使用其他代码点对此进行更多测试.
| 归档时间: |
|
| 查看次数: |
6801 次 |
| 最近记录: |