2017-04-09 17 views
0

플라스크를 사용하여 python3에 REST API를 작성하고 있으며 키 순서를 유지하면서 json으로 dict를 반환하는 방법을 찾기 위해 고심하고 있습니다. 분명 사전에 내장 된 요소의 순서가 유지되지 않기 때문에 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을 반환하려면 어떻게해야합니까?

편집 : 링크 된 포스트는 OrderedDict이 새로 추가/수정 키 삽입 순서를 유지하는 것이 내가이

+0

비슷하지만 나는 또한 dicts의 목록을 반환 할 수 있기를 바랍니다. Json은 포스트가 방금 dict에 관한 것입니다. – bs7280

+0

dicts의 목록도 다르지 않습니다. 답변에 설명 된대로 처리 된 각 dict을 목록에 추가하고 jsonify하면됩니다. – davidism

답변

-1

귀하의 문제는 사전의 목록을 위해 일해야하는 사전 만 있기 때문에 이 중복되지 않습니다/값 쌍.

사전에 키/값을 가져 오는 방법은 모두 다름입니다.

표준 ** 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에 따르면, 자바 스크립트 객체 표기법 (JSON)을위한 텍스트 형식입니다 구조화 된 데이터의 직렬화. ECMAScript 프로그래밍 언어 표준 제 3 판 [ECMA-262]에 정의 된대로 JavaScript의 객체 리터럴에서 파생됩니다.

목적은 이름 문자열이며 값은 문자열, 숫자, 부울 , NULL, 오브젝트 또는 어레이 제로 이상의 이름/값 쌍 unordered 컬렉션이다.

배열은 0 이상의 값을 갖는 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 (기본값 : 거짓)이면 사전의 출력이 키순으로 정렬됩니다. 정렬 는이하도록 코드를 변경할 수

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

출력

[{ "A"1 "C": 3 "Z"2}]