在将OrderedDict转换为JSON时,如何保留OrderedDict的顺序

时间:2017-04-09 19:36:14

标签: python json python-3.x flask ordereddictionary

我正在使用flask在python3中编写一个REST API,我一直在努力找到一种方法,在保持键的顺序的同时将dict作为json返回。我正在使用OrderedDict,因为显然内置字典不会保留元素的顺序。

我有一个看起来像这样的方法:

@app.route('/foobar', methods=['GET'])
def foobar()
    data = [OrderedDict([("a",1),
        ("b",2),
        ("c",3)])]
    return jsonify(data),200

以下是我可以获得的输出示例:

[{"b":2,"c":3,"a":1}]

这就是我想要的:

[{"a":1,"b":2,"c":3}]

如何按照在有序字典中定义的顺序返回JSON?

编辑: 这不是重复的,因为链接的帖子仅用于字典,我需要这个字典用于字典列表

2 个答案:

答案 0 :(得分:0)

根据RFC7159,JavaScript Object Notation(JSON)是用于结构化数据序列化的文本格式。它源自JavaScript的对象文字,如ECMAScript编程语言标准第三版[ECMA-262]中所定义。

对象是零个或多个名称/值的unordered集合    对,其中名称是字符串,值是字符串,数字,    boolean,null,object或array。

数组是零个或多个值的ordered序列。

对于你的json的订单,你可以使用:

@app.route('/')
def foobar():
    data = OrderedDict([("a",1), ("z",2), ("c",3)])
    return json.dumps([data])

输出

  

[{“a”:1,“z”:2,“c”:3}]

如果sort_keys为true(默认值:False),则字典的输出将按键排序。 对于排序,您可以将代码更改为:

@app.route('/foobar', methods=['GET'])
def foobar()
    data = [OrderedDict([("a",1),
        ("z",2),
        ("c",3)])]
    return json.dumps(data, sort_keys=True)

输出

  

[{“a”:1,“c”:3,“z”:2}]

答案 1 :(得分:-2)

您的问题是OrderedDict保留了新添加/修改的键/值对的插入顺序。

这完全取决于你如何获得字典中的键/值。

如果你通过标准** kwargs,你将失败。

如果元素作为可迭代(如您的示例中所示)或稍后插入而传递,则订单将被保留。

标准kwargs

d = OrderedDict(a=1, b=2, c=3)
data = [d]
print(json.dumps(data))

输出:

[{"a": 1, "c": 3, "b": 2}]

错误的订单。

但是有可迭代的

d = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
data = [d]
print(json.dumps(data))

输出:

[{"a": 1, "b": 2, "c": 3}]

订单已被保留。

手动插入

d = OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3
data = [d]
print(json.dumps(data))

输出:

[{"a": 1, "b": 2, "c": 3}]

订单再次被保留