【发布时间】:2016-04-25 14:46:30
【问题描述】:
JSON 对象被打印到我的系统日志文件中。我需要从日志中提取字符串并将其转换为 JSON。我在提取 '{' 和 '}' 之间的字符串时没有任何问题,但是某些字符串中包含转义字符,这导致 json.loads 失败
问题来了:
>>> import json
>>> resp = '{"from_hostname": {"value": "mysite.edu\"", "value2": 0, "value3": 1}}'
>>> json.loads(resp)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 381, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 1 column 41 (char 40)
>>> resp[40]
'"'
>>> resp[41]
','
>>> resp[39]
'"'
>>>
当json 看到\" 我猜它只看到" 并假设字符串结束,它会抛出分隔符错误。
我尝试用\\" 替换\",但这似乎不起作用。
注意:\" 可以出现在字符串的开头、结尾或中间。
我如何让它工作?
【问题讨论】:
-
如果打印
resp,就没有\:{"from_hostname": {"value": "mysite.edu"", "value2": 0, "value3": 1}} -
总是出现在值中吗?你可以试试
resp = re.sub(r'(:\s*")([^,]*)",', lambda x: x.group(1) + x.group(2).replace("\"", r"\"") + '",', resp),然后print(json.loads(resp)) -
如何提取 JSON 字符串?您也可以发布该代码吗?