在python中将str转换为dict
我使用subprocess.Popen()从一个进程的输出中得到了这个: 对我来说,它似乎不是一个有效的json。 我使用了在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
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)