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

Posted

技术标签:

【中文标题】Python - 将带有转义字符的字符串转换为 json【英文标题】:Python - Converting a string with escape characters to json 【发布时间】: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 字符串?您也可以发布该代码吗? 【参考方案1】:

如果\" 可以出现在您的字符串中,您必须使用\" 转义

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"'

这是对您问题的正确解释吗?

【讨论】:

嗨,是的,但是我在将额外的转义字符附加到字符串时遇到了问题。无论我添加多少个转义字符,我仍然没有看到字符串中附加的 \。【参考方案2】:

问题是反斜杠字符正在转义 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 字符串上失败,这强烈表明存在问题。您应该在问题中发布提取代码,以便进行检查。

【讨论】:

是的,这正是我开始做的,我一直坚持将额外的 \ 添加到字符串中。我尝试了 str.replace('\"', '\\"') 和其他一些变体,但无法添加额外的 \.. 你能帮忙吗,我知道这是基础知识,但由于某种原因无法获得过去了。 您能否发布从日志文件中提取 JSON 字符串的代码和文件示例?如果文件包含有效的 JSON,则不需要执行任何替换。

以上是关于Python - 将带有转义字符的字符串转换为 json的主要内容,如果未能解决你的问题,请参考以下文章

阻碍 Python 将 JSON 数据转换为转义的特殊字符时出现 Python UnicodeDecodeError [重复]

将包含转义字符的字符串转换为dict

将 Python 转义的 unicode 序列转换为 UTF-8

python转换已转义的字符串

将 \x 转义字符串转换为 UTF-8 [重复]

Python/Bash - 获取带有转义字符的文件名