2017-04-09 4 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}] 

注文されたdictで定義されている順序でJSONを返すにはどうすればよいですか?

編集:リンクポストはOrderedDictが新しく追加された/変更され、キーの挿入順序を保持していること、私はこれが

+0

それと似ていますが、私はまた、ちょうど約dictであるJsonとして適切にdictsのリストを返すことができるようにしたいです – bs7280

+0

dictsのリストも違いはありません。答えに記述されているように、処理された各辞書をリストに追加し、それを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によると、JavaScriptのオブジェクト表記法(JSON)はテキスト形式です構造化データの直列化。 ECMAScriptプログラミング言語標準、第3版[ECMA-262]で定義されているJavaScriptのオブジェクトリテラルから派生したものです。

オブジェクトは、名前が文字列であり、値はストリング、数、 ブール値、ヌル、オブジェクト、または配列ゼロ以上の名前/値ペアの unorderedコレクションです。

配列は、0以上の値のorderedシーケンスです。

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

が出力

[{ "A":1、 "Z":2、 "C":3}]は、これを使用することができ、あなたのJSONのためのメイクオーダーの場合

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) 

出力

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

関連する問題