5

我有一个字符串,它基本上包含一堆 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,但我希望这是相对容易的部分!

4

3 回答 3

19

您可以使用JSONDecoderobject_pairs_hook的参数将解码的字典更改为 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')])
于 2013-05-20T01:05:39.830 回答
6

首先,您应该考虑使用json(或什至ast.literal_eval)而不是eval.

其次,这是行不通的,因为一旦你把它变成普通字典,所有的顺序都会丢失。如果要将信息放入 OrderedDict,则需要自己解析“json”。

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
于 2013-05-20T00:53:45.493 回答
0

这篇文章与使用字符串操作的字符串到有序字典的转换有关:

https://stackoverflow.com/a/27177986/1128709

于 2014-11-27T20:01:42.133 回答