Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-将带有转义字符的字符串转换为json_Python_Json_Regex_String - Fatal编程技术网

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

Python-将带有转义字符的字符串转换为json,python,json,regex,string,Python,Json,Regex,String,JSON对象被打印到我的syslog文件中。我需要从日志中提取字符串并将其转换为JSON。我在提取“{”和“}”之间的字符串时没有任何问题,但某些字符串中有转义字符,这会导致json.loads失败 问题是: >>> import json >>> resp = '{"from_hostname": {"value": "mysite.edu\"", "value2": 0, "value3": 1}}' >>> json.loads(res

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 >>>resp='{“from_hostname”:{“value”:“mysite.edu\”,“value2”:0,“value3”:1} >>>json.loads(resp) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/_init__.py”,第338行,加载 返回\u默认\u解码器。解码 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py”,解码中的第365行 obj,end=self.raw\u decode(s,idx=\u w(s,0.end()) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py”,第381行,原始解码 obj,end=self.scan_一次(s,idx) ValueError:应为,分隔符:第1行第41列(字符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字符串,这强烈表明存在问题。您应该在问题中发布提取代码,以便检查。

如果打印
resp
,将不会有
\
{“从主机名:{“值”:“mysite.edu”,“value2”:0,“value3”:1}
值中是否始终显示这些值?您可以尝试
resp=re.sub(r'(:\s*)([^,]*)”)“,”,lambda x:x.group(1)+group(2).replace(“\”,r“\”)+“,”,resp)
,然后
print(json.loads(resp))
如何提取json字符串?你也可以发布代码吗?嗨,是的,但是我在字符串中附加额外的转义字符时遇到了问题。无论我添加了多少转义字符,我仍然没有在字符串中添加\。是的,这正是我开始做的,我一直在向字符串添加额外的\。我尝试了str.replace(“\”,“\\”)和其他一些变体,但无法添加额外的\。。你能帮忙吗,我知道这是最基本的,但由于某些原因无法通过。你能发布从日志文件中提取JSON字符串的代码和该文件的示例吗?如果文件包含有效的JSON,则不需要执行任何替换。