在python中将str转换为dict



我使用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  ]
  ]
}

它似乎不是一个有效的json对我来说。我用过ast.literal_eval()json.loads(),但运气不好。有人能给我指个方向吗?

的确,旧版本的rddtool导出ECMA-script,而不是JSON。根据这个debian bug报告,升级1.4.8应该会给你正确的JSON。参见项目CHANGELOG:

导出的JSON输出现在实际上是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)

这确实不是有效的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]
    ]
}

相关内容

  • 没有找到相关文章

最新更新