簡體   English   中英

Python - 將帶有轉義字符的字符串轉換為json

[英]Python - Converting a string with escape characters to json

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看到\\"我猜它只能看到"並假設字符串結束時,它會拋出分隔符錯誤。

我試圖取代\\"\\\\" ,但似乎並沒有工作。

注意: \\"可以出現在字符串的開頭或結尾或中間。

我該如何工作?

如果\\"可以出現在你的字符串中,你必須逃避\\"

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

這是你的問題的正確插入嗎?

問題是反斜杠字符是在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字符串上失敗,這強烈表明存在問題。 您應該在問題中發布提取代碼,以便進行檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM