Преобразование str в dict в python

Я получил это из вывода процесса, используя subprocess.Popen ():

{ 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 ] ] } 

Для меня это не похоже. Я использовал ast.literal_eval() и json.loads() , но не повезло. Может ли кто-нибудь помочь мне в правильном направлении? Заранее спасибо.

    2 Solutions collect form web for “Преобразование str в dict в python”

    Действительно, более старые версии rddtool экспортируют ECMA-скрипт, а не JSON. Согласно этому отчету об ошибках debian, повышение 1.4.8 должно дать вам правильный JSON. Также см. Проект CHANGELOG :

    Выход JSON из xport теперь фактически компилируется json по ключевым словам, которые теперь правильно цитируются.

    Если вы не можете обновить, у вас есть два варианта: либо попытайтесь переформатировать, чтобы применить цитирование идентификаторов ключевых объектов, или использовать более легкий снизу парсер и проанализировать обозначение объекта ECMA-скрипта.

    Последнее можно сделать с помощью внешней библиотеки 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) 

    Это действительно недействительно JSON. Это, однако, действительный YAML , поэтому сторонняя библиотека PyYAML может помочь вам:

     >>> import yaml >>> yaml.load(text) { 'about': 'RRDtool xport JSON output', 'meta': { 'start': 1401778440, 'step': 60, 'end': 1401778440, 'legend': [ 'rta_MIN', 'rta_MAX', 'rta_AVERAGE' ] }, 'data': [ [None, None, None], [None, None, None], [None, None, None], [None, None, None], [None, None, None], [None, None, None] ] } 
      Python - лучший язык программирования в мире.