Les dict
objets Python (avant Python 3.7) et JSON sont des collections non ordonnées. Vous pouvez passer le sort_keys
paramètre, pour trier les clés:
>>> import json
>>> json.dumps({'a': 1, 'b': 2})
'{"b": 2, "a": 1}'
>>> json.dumps({'a': 1, 'b': 2}, sort_keys=True)
'{"a": 1, "b": 2}'
Si vous avez besoin d'une commande particulière; vous pouvez utilisercollections.OrderedDict
:
>>> from collections import OrderedDict
>>> json.dumps(OrderedDict([("a", 1), ("b", 2)]))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict([("b", 2), ("a", 1)]))
'{"b": 2, "a": 1}'
Depuis Python 3.6 , l'ordre des arguments des mots clés est conservé et ce qui précède peut être réécrit en utilisant une syntaxe plus agréable:
>>> json.dumps(OrderedDict(a=1, b=2))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict(b=2, a=1))
'{"b": 2, "a": 1}'
Voir PEP 468 - Préservation de l'ordre des arguments de mots-clés .
Si votre entrée est donnée en JSON alors pour conserver l'ordre (à obtenir OrderedDict
), vous pouvez passer object_pair_hook
, comme suggéré par @Fred Yankowski :
>>> json.loads('{"a": 1, "b": 2}', object_pairs_hook=OrderedDict)
OrderedDict([('a', 1), ('b', 2)])
>>> json.loads('{"b": 2, "a": 1}', object_pairs_hook=OrderedDict)
OrderedDict([('b', 2), ('a', 1)])
OrderedDict()
, vous pouvez passer undict
àOrderedDict()
, vous pouvez également passer une liste de paires ordonnées àdict()
- bien que l'ordre soit perdu dans ces deux cas.ordereddict_literals
ducodetransformer
package (qualité alpha)d = json.load(f, object_pairs_hook=OrderedDict)
, une version ultérieurejson.dump(d)
conservera l'ordre des éléments d'origine.Comme d'autres l'ont mentionné, le dict sous-jacent n'est pas ordonné. Cependant, il existe des objets OrderedDict en python. (Ils sont intégrés dans les pythons récents, ou vous pouvez utiliser ceci: http://code.activestate.com/recipes/576693/ ).
Je crois que les nouvelles implémentations de pythons json gèrent correctement les OrderedDicts intégrés, mais je ne suis pas sûr (et je n'ai pas un accès facile au test).
Les anciennes implémentations de pythons simplesjson ne gèrent pas correctement les objets OrderedDict ... et les convertissent en dictés normaux avant de les afficher ... mais vous pouvez surmonter cela en procédant comme suit:
maintenant en utilisant cela, nous obtenons:
Ce qui est à peu près comme souhaité.
Une autre alternative serait de spécialiser l'encodeur pour utiliser directement votre classe de lignes, et vous n'aurez alors pas besoin de dict intermédiaire ou de UnorderedDict.
la source
sort_keys
àTrue
lors de l' appeljson.dumps()
; pour la stabilité de l'ordre (pour les tests, la mise en cache stable ou les validations VCS), le tri des clés suffit.L'ordre d'un dictionnaire n'a aucun rapport avec l'ordre dans lequel il a été défini. Ceci est vrai pour tous les dictionnaires, pas seulement ceux qui sont convertis en JSON.
En effet, le dictionnaire a été «retourné» avant même d'atteindre
json.dumps
:la source
hé je sais qu'il est trop tard pour cette réponse mais ajoutez sort_keys et attribuez-lui false comme suit:
cela a fonctionné pour moi
la source
json.dump () conservera l'ordre de votre dictionnaire. Ouvrez le fichier dans un éditeur de texte et vous verrez. Il conservera la commande, que vous lui envoyiez ou non un OrderedDict.
Mais json.load () perdra l'ordre de l'objet enregistré à moins que vous ne lui disiez de se charger dans OrderedDict (), ce qui est fait avec le paramètre object_pairs_hook comme JFSebastian l'a indiqué ci-dessus.
Sinon, il perdrait l'ordre car, dans le cadre d'une opération habituelle, il charge l'objet dictionnaire enregistré dans un dict normal et un dict régulier ne conserve pas l'odeur des éléments qui lui sont donnés.
la source
en JSON, comme en Javascript, l'ordre des clés d'objet n'a pas de sens, donc peu importe l'ordre dans lequel elles sont affichées, c'est le même objet.
la source
dict
)