2024-04-25 21:11:32 发布
网友
我有一个有问题的json字符串包含一些有趣的unicode字符
"test":{"foo":"Ig0s\x5C/k\x5C/4jRk"}}
如果我用python转换
如果我可以接受跳过/丢失这些unicode字符的值,那么让json.loads(s)正常工作的最佳方法是什么?在
json.loads(s)
如果除了无效的\x5c之外的其余字符串是JSON,则可以使用string-escape编码将“'\x5c解码为反斜杠:
\x5c
string-escape
>>> 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文本字符串表示中加倍。实际字符串值为:
\x5C
它将输入解析为Python源代码,但只允许文本值;字符串、None、True、False、数字和容器(列表、元组、字典)。在
None
True
False
此方法比json.loads()慢,因为它用纯Python代码执行部分解析树处理。在
json.loads()
另一种方法是使用正则表达式将\xhh转义代码替换为JSON\uhhhh代码:
\xhh
\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,这将是一个更好的解决方案。在
如果除了无效的
\x5c
之外的其余字符串是JSON,则可以使用string-escape
编码将“'\x5c解码为反斜杠:您没有JSON;它可以直接解释为Python。使用^{} :
^{pr2}$\x5C
是一个反斜杠,在Python文本字符串表示中加倍。实际字符串值为:它将输入解析为Python源代码,但只允许文本值;字符串、
None
、True
、False
、数字和容器(列表、元组、字典)。在此方法比
json.loads()
慢,因为它用纯Python代码执行部分解析树处理。在另一种方法是使用正则表达式将
\xhh
转义代码替换为JSON\uhhhh
代码:演示:
如果您可以修复产生这个值的源以输出实际的JSON,这将是一个更好的解决方案。在
相关问题 更多 >
编程相关推荐