2017-04-09 239 views
0

我正在使用烧瓶在python3中编写REST API,并且一直在努力寻找一种方法来在维护键顺序的同时返回字典为json。我使用的是OrderedDict,因为内置的字典显然不会保留元素的顺序。如何保存OrderedDict在将其转换为JSON时的顺序

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

@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

它的相似,但我也希望能够正确地返回一个字典列表作为JSON,该帖子只是一个字典 – bs7280

+0

一个字典列表是没有什么不同。如答案中所述,将每个处理过的字典附加到列表中并对其进行jsonify。 – davidism

回答

-1

你的问题是一个列表工作的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}] 

而且订单已再次

1

保留根据RFC7159,JavaScript对象符号(JSON)是一个文本格式结构化数据的序列化。它来源于ECMAScript编程语言标准第三版[ECMA-262]中定义的JavaScript对象文字。

一个目的是unordered收集零个或多个名称/值 对,其中名称是一个字符串,一个值是一个字符串,数字 布尔值,null,对象或数组。

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

对于化妆为了让您的JSON您可以使用此:

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

输出

[{ “一”:1, “Z”:2, “C”:3}]

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

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

输出

[{ “一”:1, “C”:3, “Z”:2}]

相关问题