将字符串转换为有序字典?

时间:2013-05-20 00:51:50

标签: python python-2.7 dictionary

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

3 个答案:

答案 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转换有关:

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