Python - 将带有转义字符的字符串转换为json

时间:2016-01-19 22:50:49

标签: python json regex string

JSON对象将打印到我的syslog文件中。我需要从日志中提取字符串并将其转换为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看到\"时,我猜它只会看到"并假设字符串结束,并且它会抛出分隔符错误。

我尝试用\"替换\\",但这似乎不起作用。

注意:\"可以出现在字符串的开头或结尾或中间。

我该如何运作?

2 个答案:

答案 0 :(得分:5)

如果您的字符串中出现\",您必须使用

转义\"
import json
resp = '{"from_hostname": {"value": "mysite.edu\\\"", "value2": 0, "value3": 1}}'
print(json.loads(resp))

打印

{u'from_hostname': {u'value3': 1, u'value2': 0, u'value': u'mysite.edu"'}}

这是你问题的正确插入吗?

答案 1 :(得分:1)

问题是反斜杠字符是在Python字符串中转义双引号,但它实际上并不存在于字符串中。打印字符串表明了这一点:

>>> print '{"from_hostname": {"value": "mysite.edu\"", "value2": 0, "value3": 1}}'
'{"from_hostname": {"value": "mysite.edu"", "value2": 0, "value3": 1}}'

这表明字符串中的反斜杠不是。因此必须对双引号进行转义,以使字符串成为有效的JSON字符串,这意味着字符串中必须存在反斜杠。你可以通过用另一个反斜杠转义反斜杠本身来做到这一点,即\\

>>> print '{"from_hostname": {"value": "mysite.edu\\"", "value2": 0, "value3": 1}}'
{"from_hostname": {"value": "mysite.edu\"", "value2": 0, "value3": 1}}

json.loads()现在有效:

>>> json.loads('{"from_hostname": {"value": "mysite.edu\\"", "value2": 0, "value3": 1}}')
{u'from_hostname': {u'value3': 1, u'value2': 0, u'value': u'mysite.edu"'}}

或者您可以使用原始字符串:

>>> json.loads(r'{"from_hostname": {"value": "mysite.edu\"", "value2": 0, "value3": 1}}')
{u'from_hostname': {u'value3': 1, u'value2': 0, u'value': u'mysite.edu"'}}

但是,json.loads()对从日志文件中提取的JSON字符串失败,这强烈表明存在问题。您应该在问题中发布提取代码,以便进行检查。