我正在使用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?
编辑: 这不是重复的,因为链接的帖子仅用于字典,我需要这个字典用于字典列表
答案 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}]
订单再次被保留