[英]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.