在Python中分析无效的Unicode JSON

2024-04-25 21:11:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有问题的json字符串包含一些有趣的unicode字符

"test":{"foo":"Ig0s\x5C/k\x5C/4jRk"}}

如果我用python转换

^{pr2}$

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


Tags: 方法字符串testjsonfoounicode字符loads
2条回答

如果除了无效的\x5c之外的其余字符串是JSON,则可以使用string-escape编码将“'\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'}}

您没有JSON;它可以直接解释为Python。使用^{}

>>> import ast
>>> s = r'{"test":{"foo":"Ig0s\x5C/k\x5C/4jRk"}}'
>>> ast.literal_eval(s)
{'test': {'foo': 'Ig0s\\/k\\/4jRk'}}

\x5C是一个反斜杠,在Python文本字符串表示中加倍。实际字符串值为:

^{pr2}$

它将输入解析为Python源代码,但只允许文本值;字符串、NoneTrueFalse、数字和容器(列表、元组、字典)。在

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

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

import re

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

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

演示:

>>> import json
>>> json.loads(repair(s))
{u'test': {u'foo': u'Ig0s\\/k\\/4jRk'}}

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

相关问题 更多 >