2015-07-22 4 views
0

Так файл JSON Я хочу, чтобы разобрать выглядит так:Как разобрать недопустимый файл JSON в Python

{ 
    "container_header_255_2013-12-31 16:00:45": { 
    "fw_package_version": "255.255.255X255", 
    "start_timestamp": 1388534445, 
    "start_timestr": "2013-12-31 16:00:45", 
    "end_timestamp": 4294967295, 
    "end_timestr": "2106-02-06 22:28:15", 
    "length": 65535, 
    "product": "UNKNOWN", 
    "hw_version": "UNKNOWN" 
    }, 
    "log_packet_debug_1388534445_2013-12-31 16:00:45": { 
    "timestamp": 1388534445, 
    "timestr": "2013-12-31 16:00:45", 
    "log_level": "DBG", 
    "log_id": "0xC051", 
    "log_string": "DBG_STORAGE_LOG", 
    "file_name_line": "storage_data.c733", 
    "message": "Mark as Erasable: 231 238" 
    }, 

жаль отступа может быть немного прочь. но в любом случае все примеры, которые я видел в Интернете, включают списки, и по какой-то причине в этом содержатся только словари

+0

импорта JSON v = json.loads (your_json_text) Однако, я предполагаю, что здесь, и это "" сообщение ": "Отметить как стираемые: 231 238" должен быть списком. Его недействительный json и вам придется либо написать собственный синтаксический анализатор, либо отформатировать его как действительный json: { ... "message": {"Mark as Erasable": [231, 238] } } –

+0

Я, хотя t, что было проблемой, я, однако, не создал json-файл, поэтому я просто должен разобрать его вручную. –

+1

Должно быть повторно показано, как разобрать недопустимый json-файл –

ответ

2

Вы можете использовать модуль splitstream (отказ от ответственности: я написал его) для этого (pip install splitstream). Он имеет параметр startdepth, который специально разработан для анализа потоков XML/JSON, которые еще не были завершены или «бесконечны» (например, файлы журналов).

from splitstream import splitfile 
from StringIO import StringIO 
import json 

jsonfile = StringIO(""".....""") # your neverending JSON-sorta logfile 
# Probably, you want something like this instead 
#jsonfile = file("/var/log/my/log.json", "r") 

# startdepth is the magic argument here: it starts splitting at depth = 1 
for s in splitfile(jsonfile, format="json", startdepth=1): 
    print "JSON",json.loads(s) 

Что дает:

JSON {u'start_timestamp': 1388534445, u'hw_version': u'UNKNOWN', u'fw_package_version': u'255.255.255X255', u'product': u'UNKNOWN', u'end_timestr': u'2106-02-06 22:28:15', u'length': 65535, u'start_timestr': u'2013-12-31 16:00:45', u'end_timestamp': 4294967295} 
JSON {u'file_name_line': u'storage_data.c733', u'log_level': u'DBG', u'log_id': u'0xC051', u'timestamp': 1388534445, u'timestr': u'2013-12-31 16:00:45', u'log_string': u'DBG_STORAGE_LOG', u'message': u'Mark as Erasable: 231 238'} 
Смежные вопросы