70 votes

Tri des sorties JSON en Python

J'ai un problème avec JSON en python.

En fait, si j'essaye d'exécuter ce code, python me donne une chaîne JSON triée!

Par exemple:

 values = {'profile' : 'testprofile', 
          'format': 'RSA_RC4_Sealed', 
          'enc_key' : base64.b64encode(chiave_da_inviare), 
          'request' : base64.b64encode(data)
      }


values_json = json.dumps(values, sort_keys=False, separators=(',', ':'))
 

et voici la sortie:

 {"profile":"testprofile","enc_key":"GBWo[...]NV6w==","request":"TFl[...]uYw==","format":"RSA_RC4_Sealed"}
 

Comme vous pouvez le constater, j’ai essayé d’utiliser "sort_keys = False" mais rien n’a changé.

Comment puis-je empêcher Python de trier mes chaînes JSON?

102voto

MrGray Points 454

Essayez OrderedDict de la bibliothèque standard collections :

 >>> import json
>>> from collections import OrderedDict
>>> values = OrderedDict([('profile','testprofile'), 
                          ('format', 'RSA_RC4_Sealed'), 
                          ('enc_key', '...'), 
                          ('request', '...')])
>>> json.dumps(values, sort_keys=False)
'{"profile": "testprofile", "format": "RSA_RC4_Sealed", "enc_key": "...", "request": "..."}'
 

Malheureusement, cette fonctionnalité est New in version 2.7 pour collections

58voto

Joe Points 1396

Vous stockez vos valeurs dans un dict Python qui n’a aucune notion inhérente d’ordre, c’est juste une carte clé => valeur. Ainsi, vos articles perdent tout ordre lorsque vous les placez dans la variable "valeurs".

En fait, la seule façon d'obtenir un ordre déterministe serait d'utiliser "sort_keys = True", ce qui, je suppose, les place dans un ordre alphanumérique. Pourquoi la commande est-elle si importante?

8voto

Eli Courtwright Points 53071

Si vous spécifiez sort_keys=False Python imprimera simplement les éléments dans l'ordre de leur apparition dans l'objet dict Python sous-jacent. Dans certains cas, cet ordre peut être identique à l'ordre de tri alphanumérique par défaut. Dans votre exemple, les clés NE SONT PAS même triées comme cela, car "format" vient après "demande". Quoi qu'il en soit, le paramètre sort_keys est toujours valide, comme en témoigne cet exemple de code:

 >>> import json
>>> json.dumps({"a":5, "b":6, "c":7}, sort_keys=False)
'{"a": 5, "c": 7, "b": 6}'
 

5voto

Ned Batchelder Points 128913

Les clés ne sont pas triées: "profile", "enc_key", "request", "format".

Il semble que vous souhaitiez qu'ils apparaissent dans le même ordre que vous les avez créés dans le dictionnaire, mais les dictionnaires sont intrinsèquement non triés, ils ne se souviennent pas de l'ordre dans lequel vous avez inséré les clés.

Vous pouvez utiliser un certain nombre d'implémentations SortedDict, mais l'encodeur JSON ne saura pas l'utiliser pour obtenir les clés dans l'ordre souhaité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X