Python 如何在将OrderedDict转换为JSON时保持其顺序
我正在使用flask在python3中编写一个restapi,我一直在努力寻找一种方法,在保持键顺序的同时将dict作为json返回。我使用OrderedDict是因为内置字典显然不保留元素的顺序 我有一个方法如下所示: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
@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}]