我有一个字符串,它基本上包含一堆JSON格式的文本,我最终希望以“漂亮的打印”格式导出到Excel,并使用适当的嵌套缩进等。
为了便于阅读,必须保留密钥/值的原始顺序。我完成我想要的思考过程是
a)使用类似eval之类的东西将字符串转换为字典和 b)使用集合库中的OrderedDict来保持订单的完整。
但是我没有得到预期的结果:
In [21]: json_string = str({"id":"0","last_modified":"undefined"})
In [22]: OrderedDict(eval(json_string))
Out[23]: OrderedDict([('last_modified', 'undefined'), ('id', '0')])
我还没有完全弄清楚我将如何以漂亮的打印格式将输出写入excel,但我希望这是相对容易的部分!
答案 0 :(得分:19)
您可以使用object_pairs_hook
参数JSONDecoder将已解码的词典更改为OrderedDict:
import collections
import json
decoder = json.JSONDecoder(object_pairs_hook=collections.OrderedDict)
json_string = '{"id":"0","last_modified":"undefined"}'
print decoder.decode(json_string)
json_string = '{"last_modified":"undefined","id":"0"}'
print decoder.decode(json_string)
打印:
OrderedDict([(u'id', u'0'), (u'last_modified', u'undefined')])
OrderedDict([(u'last_modified', u'undefined'), (u'id', u'0')])
答案 1 :(得分:6)
首先,您应该考虑使用json
(甚至是ast.literal_eval
)代替eval
。
其次,这不会起作用,因为你把它变成普通字典的那一刻,所有的订单都会丢失。你需要解析" json"如果你想把信息放到OrderedDict中,你自己。
幸运的是,如果你使用ast
模块,这并不像你想象的那么难。在这里,我假设字典只包含字符串,但它不应该太难以修改用于其他目的。
s = '{"id":"0","last_modified":"undefined"}'
import ast
from collections import OrderedDict
class DictParser(ast.NodeVisitor):
def visit_Dict(self,node):
keys,values = node.keys,node.values
keys = [n.s for n in node.keys]
values = [n.s for n in node.values]
self.od = OrderedDict(zip(keys,values))
dp = DictParser()
dp.visit(ast.parse(s))
ordered_dict = dp.od
print ordered_dict
答案 2 :(得分:0)
这篇文章与使用字符串操作的字符串到ordereddict转换有关: