2017-03-10 38 views
0

このサイトの非常に有益な人物であるため、ユーザ名を入力してループを使用してそれぞれを追加するスクリプトを作成することができましたそれらのユーザー名を特定のJSON構造に変換します。しかし、私はJSONダンプ内の順序が維持されていないことに気付きました。 「list_users」で同じ順序を維持することが可能であった場合、私は思っていたPythonのJSONダンプでディクショナリ要素の順序を維持する方法

({"member": 123, 
    "comment": "this is a comment" 
    "name": user 
    }) 

:私のプリントは、このようになります

list_users = [] 
for user in users: 
    list_users.append({"name": user, 
         "member": 123, 
         "comment": "this is a comment"}) 

json_user_list_encoding = json.dumps(list_users, indent=2) 

:たとえば、ここのように私のループとJSONダンプが見えるものです私はJSONのダンプを使用します。私はこのサイトを少し見て、読んだことから特定の注文を維持するためにキーを割り当てる必要があります。しかし、私はこれを行う方法がわかりません。私は1つのJSONオブジェクトしか持っていません。私はこれが意味をなさないことを望む。助けてくれてありがとう。

+2

辞書要素は、本質的に順序付けられていないデータ構造です。 '{" a ":" b ":2}'は '{" b ":2、" a ":1}'と同じです。 –

+0

なぜ注文が必要ですか? – acushner

+0

...あなたが自分でキーを割り当てたとしても( 'd = {}; d [" a "] = 1; d [" b "] = 2') (実際に関係*が実装定義のハッシュアルゴリズムの詳細に依存するかどうかにかかわらず)文書化されたセマンティクスによって保証されているので、割り当て順序と格納/出力順序には関係がないため、 。 –

答えて

7

あなたはちょうどそれらが確実に/繰り返し注文したいが、順序自体を気にしない場合は、jsonダンプが助けることができるsort_keys kwarg受け入れ:OrderedDictでユーザーを入れ、それ以外の場合は

>>> json.dumps({'z': 3, 'b': 2, 'a': 1}) 
'{"a": 1, "z": 3, "b": 2}' 
>>> json.dumps({'z': 3, 'b': 2, 'a': 1}, sort_keys=True) 
'{"a": 1, "b": 2, "z": 3}' 

を明白なdictの代わりに。

from collections import OrderedDict 

list_users.append(OrderedDict([ 
    ("name", user), 
    ("member", 123), 
    ("comment", "this is a comment"), 
])) 

あなたがにそれらを必要とする場合も同じ順序にをデシリアライズ、ロードするときobject_pairs_hookを使用しています。

+0

優秀な点 - 入力ファイルがシェルスクリプトなどで生成された場合、 'jq'をサポートする*、*にはキーをソートするオプションもあります。 –

+0

あああ...はい、意味があります。ありがとう! – user7681184

関連する問題