2016-01-19 4 views
3

Объекты JSON печатаются в моем файле syslog. Мне нужно извлечь строку из журнала и преобразовать ее в JSON. У меня нет никаких проблем, извлекая строку между «{» и «}», но некоторые строки имеют экранирующий символ в них, и это вызывает json.loads сбойPython - Преобразование строки с escape-символами в json

Вот проблема:

>>> 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 видит \" Я предполагаю, что он видит только " и предполагает, что строка завершена, и она выдает ошибку разделителя.

Я попытался заменить \" на \\", но это не работает.

ПРИМЕЧАНИЕ: \" может происходить в начале или в конце или в середине строки.

Как это получить?

+0

Если вы напечатаете 'resp', не будет' '\' ':' {"from_hostname": {"value": "mysite.edu" ", value2": 0, "value3": 1} } ' –

+0

Всегда ли появляются значения? Вы можете попробовать' resp = re.sub (r '(: \ s * ") ([^,] *)",', lambda x: x.group (1) + x.group (2) .replace ("\" ", r" \ "") + '",', resp)', а затем 'print (json.loads (resp))' –

+0

Как вы извлекаете Строки JSON? Можете ли вы опубликовать этот код? – mhawke

ответ

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

является ли это право interpration вашего вопроса?

+0

привет, да, однако у меня была проблема с добавлением дополнительных символов escape в строку.Как бы то ни было, количество эскизных символов, которые я добавляю, я до сих пор не видел \ appended в строке. – gixxer

0

Проблема заключается в том, что символ обратной косой черты избегает двойной кавычки в строке 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, которые вы использовали вырезанный из файла журнала, который настоятельно указывает на то, что проблема существует. Вы должны отправить код извлечения в свой вопрос, чтобы его можно было проверить.

+0

Да, это именно то, что я начал делать, и я застрял в добавлении лишнего \ в строку. Я попробовал str.replace ('\ "', '\\"') и некоторые другие варианты, но не смог добавить дополнительный файл \ .. Можете ли вы помочь, я знаю, что это основы, но по какой-то причине не удалось получить мимо этого. – gixxer

+0

Можете ли вы опубликовать код, который извлекает строки JSON из файла журнала и образец файла? Если файл содержит действительный JSON, вам не нужно выполнять какие-либо подстановки. – mhawke

Смежные вопросы