在Python中解析无效的Unicode JSON

在Python中解析无效的Unicode JSON,python,json,python-2.7,unicode,utf-8,Python,Json,Python 2.7,Unicode,Utf 8,我发现一个有问题的json字符串包含一些时髦的unicode字符 "test":{"foo":"Ig0s\x5C/k\x5C/4jRk"}} 如果我使用python进行转换 import json s = r'{"test":{"foo":"Ig0s\x5C/k\x5C/4jRk"}}' json.loads(s) # Error.. 如果我可以接受跳过/丢失这些unicode字符的值,那么让我的json.loads工作的最佳方法是什么?您没有json;这可以直接解释为Python。使用:

我发现一个有问题的json字符串包含一些时髦的unicode字符

"test":{"foo":"Ig0s\x5C/k\x5C/4jRk"}}
如果我使用python进行转换

import json
s = r'{"test":{"foo":"Ig0s\x5C/k\x5C/4jRk"}}'
json.loads(s) 
# Error..

如果我可以接受跳过/丢失这些unicode字符的值,那么让我的
json.loads
工作的最佳方法是什么?

您没有json;这可以直接解释为Python。使用:

\x5C
是一个反斜杠,在这里是Python文本字符串表示形式的两倍。实际字符串值为:

>>> print _['test']['foo']
Ig0s\/k\/4jRk
这将输入解析为Python源代码,但只允许文本值;字符串、
None
True
False
、数字和容器(列表、元组、字典)

此方法比
json.loads()
慢,因为它在纯Python代码中执行部分解析树处理

另一种方法是使用正则表达式将
\xhh
转义代码替换为JSON
\uhhh
代码:

import re

escape_sequence = re.compile(r'\\x([a-fA-F0-9]{2})')

def repair(string):
    return escape_sequence.sub(r'\\u00\1', string)
演示:


如果您可以修复产生此值的源代码以输出实际的JSON,那么这将是一个更好的解决方案。

如果字符串中除了无效的
\x5c
之外的其余部分是JSON,那么您可以使用
字符串转义
编码将“'\x5c”解码为反斜杠:

>>> import json
>>> s = r'{"test":{"foo":"Ig0s\x5C/k\x5C/4jRk"}}'
>>> json.loads(s.decode('string-escape')) 
{u'test': {u'foo': u'Ig0s/k/4jRk'}}

看来你少了一些斜线。当我添加斜杠时,效果很好<代码>在[11]:s=r'{“test”:{“foo”:“Ig0s\\x5C/k\\x5C/4jRk”}在[12]:json.loads(s)Out[12]:{u'test':{u'foo':u'Ig0s\\x5C/k\\x5C/4jRk'}@shiplu.mokadd.im:是的,当然,然后你刚刚逃脱了逃逸。但这不是重点,不是吗。
ast.literal\u eval()
可能在JSON文本上失败,例如
true
false
null
。如果用偶数个反斜杠转义
x..
,则正则表达式可能失败。你可以
>>> import json
>>> json.loads(repair(s))
{u'test': {u'foo': u'Ig0s\\/k\\/4jRk'}}
>>> import json
>>> s = r'{"test":{"foo":"Ig0s\x5C/k\x5C/4jRk"}}'
>>> json.loads(s.decode('string-escape')) 
{u'test': {u'foo': u'Ig0s/k/4jRk'}}