在python中将str转换为dict

在python中将str转换为dict,python,json,dictionary,rrdtool,Python,Json,Dictionary,Rrdtool,我使用subprocess.Popen()从一个进程的输出中得到了这个: 对我来说,它似乎不是一个有效的json。 我使用了ast.literal\u eval()和json.loads(),但运气不好。 有人能帮我找到正确的方向吗? 提前感谢。这确实是无效的JSON。但是,它是有效的,因此第三方库可能会帮助您: >>> import yaml >>> yaml.load(text) { 'about': 'RRDtool xport JSON out

我使用subprocess.Popen()从一个进程的输出中得到了这个:

对我来说,它似乎不是一个有效的json。 我使用了
ast.literal\u eval()
json.loads()
,但运气不好。 有人能帮我找到正确的方向吗?
提前感谢。

这确实是无效的JSON。但是,它是有效的,因此第三方库可能会帮助您:

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

实际上,较旧版本的
rddtool
导出的是ECMA脚本,而不是JSON。根据1.4.8的升级,应该为您提供适当的JSON。另见项目:

xport的JSON输出现在实际上是JSON编译器的键 现在被正确引用

如果您无法升级,这里有两个选项;尝试重新格式化以引用对象键标识符,或者使用更宽松的解析器解析ECMA脚本对象符号

后者可通过外部设备完成:

修复可以使用正则表达式来完成;我将假设所有标识符都位于新行上,或者直接位于开头的大括号{之后。列表中的单引号将必须更改为双引号;这仅在值中没有嵌入单引号的情况下才有效:

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

yourtext=re.sub(r'(?)^|(?如果您无法让进程生成严格的JSON,请尝试一个。这确实是无效的JSON;密钥名称需要引用。JSON的格式总是有这么多的空格吗?@MartijnPieters:是的,密钥名称确实应该在引号中。我也不确定空格的数量。@Shark:我们可以尝试修复JSON,或者您需要“我必须使用
demjson
来加载它。@萨曼瓦赫德:问题是这样做的自动化方式不会进一步破坏JSON格式。使用
demjson
yaml
有什么好处吗?Bcz都给了我正确的结果。@Shark:yaml声称是JSON的超集,这个语法正好在这里工作。”对于YAML也是如此。demjson明确允许这里使用的语法,因为它将此视为ECMAScript。可能是RDDTool生成了一些语法,这两种工具都无法解析,但我的直觉是在这里使用demjson。@Shark一个可能的优势是,您的输出明确声明为JSON。它只碰巧是有效的YAML,所以是一个lenient JSON解析器可能不太可能在将来的某个时候被它绊倒。
>>> 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)