Действительно, старые версии rddtool
экспортируют ECMA-скрипт, а не JSON. Согласно этому отчету об ошибках Debian, обновление 1.4.8 должно дать вам правильный JSON. Также см. проект CHANGELOG:
Вывод JSON xport теперь фактически компилируется с json, поскольку его ключи теперь правильно цитируются.
Если вы не можете обновиться, у вас есть два варианта; либо попытайтесь переформатировать, чтобы применить цитирование идентификаторов ключа объекта, либо используйте более мягкий синтаксический анализатор, который анализирует нотацию объекта ECMA-script.
Последнее можно сделать с помощью внешней demjson
библиотеки:
>>> import demjson
>>> demjson.decode('''\
... { about: 'RRDtool xport JSON output',
... meta: {
... start: 1401778440,
... step: 60,
... end: 1401778440,
... legend: [
... 'rta_MIN',
... 'rta_MAX',
... 'rta_AVERAGE'
... ]
... },
... data: [
... [ null, null, null ],
... [ null, null, null ],
... [ null, null, null ],
... [ null, null, null ],
... [ null, null, null ],
... [ null, null, null ]
... ]
... }''')
{u'about': u'RRDtool xport JSON output', u'meta': {u'start': 1401778440, u'step': 60, u'end': 1401778440, u'legend': [u'rta_MIN', u'rta_MAX', u'rta_AVERAGE']}, u'data': [[None, None, None], [None, None, None], [None, None, None], [None, None, None], [None, None, None], [None, None, None]]}
Восстановление можно выполнить с помощью регулярного выражения; Я собираюсь предположить, что все идентификаторы находятся на новой строке или сразу после открывающей фигурной скобки {
. Одинарные кавычки в списке придется заменить на двойные; это будет работать только в том случае, если в значениях нет встроенных одинарных кавычек:
import re
import json
yourtext = re.sub(r'(?:^|(?<={))\s*(\w+)(?=:)', r' "\1"', yourtext, flags=re.M)
yourtext = re.sub(r"'", r'"', yourtext)
data = json.loads(yourtext)
person
Martijn Pieters
schedule
03.06.2014
demjson
, чтобы загрузить это. - person Martijn Pieters   schedule 03.06.2014