Python 如何在将OrderedDict转换为JSON时保持其顺序

Python 如何在将OrderedDict转换为JSON时保持其顺序,python,json,python-3.x,flask,ordereddictionary,Python,Json,Python 3.x,Flask,Ordereddictionary,我正在使用flask在python3中编写一个restapi,我一直在努力寻找一种方法,在保持键顺序的同时将dict作为json返回。我使用OrderedDict是因为内置字典显然不保留元素的顺序 我有一个方法如下所示: @app.route('/foobar', methods=['GET']) def foobar() data = [OrderedDict([("a",1), ("b",2), ("c",3)])] return jsonif

我正在使用flask在python3中编写一个restapi,我一直在努力寻找一种方法,在保持键顺序的同时将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在ordered dict中定义的顺序返回JSON

编辑:
这不是重复的,因为链接文章只针对字典。我需要它来处理字典列表。

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

这完全取决于如何在字典中获取键/值

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

如果元素作为iterable传递(如示例中所示)或稍后插入,则顺序将保持不变

标准kwargs

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

[{"a": 1, "c": 3, "b": 2}]
[{"a": 1, "b": 2, "c": 3}]
[{"a": 1, "b": 2, "c": 3}]
顺序不对

但带有一个iterable

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

[{"a": 1, "c": 3, "b": 2}]
[{"a": 1, "b": 2, "c": 3}]
[{"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, "c": 3, "b": 2}]
[{"a": 1, "b": 2, "c": 3}]
[{"a": 1, "b": 2, "c": 3}]
而顺序又被保留了下来

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

对象是零个或多个名称/值的无序集合 成对,其中名称是字符串,值是字符串,数字, 布尔值、空值、对象或数组

数组是由零个或多个值组成的
有序
序列

要为您的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}]