J'ai le JSON suivant

{
    "clips": { 
        "0": {
            "name": "Please", 
            "id": 1, 
        },
        "1": {
            "name": "Print", 
            "id": 2 
        },
        "10": {
            "name": "me", 
            "id": 3 
        },
        "2": {
            "name": "in order", 
            "id": 4 
        }
    }
}

C'est fait comme ça:

print(json.dumps(data, sort_keys=True, indent=4)) ce qui est génial car il imprime les clés dans l'ordre alphanumérique. Cependant, j'ai besoin de ces imprimés dans l'ordre numérique réel, donc au-dessus de la clé "2" pour venir avant la clé "10".

Je sais que python ne trie généralement pas les clés dans un dictionnaire, mais je dois le faire car le json sera réellement lu par les humains et le commander serait génial. Je vous remercie.

2
Startec 10 juil. 2015 à 23:38

3 réponses

Meilleure réponse

Vous pouvez utiliser une astuce de compréhension de dict:

import json

d = dict({'2':'two', '11':'eleven'})
json.dumps({int(x):d[x] for x in d.keys()}, sort_keys=True)

Production:

'{"2": "two", "11": "eleven"}'
4
A.P. 10 juil. 2015 à 21:25

Essaye ça.

from collections import OrderedDict

ordKeys = sorted([int(x) for x in originalDict.keys()])

newDict = OrderedDict()
for key in ordKeys:
    newDict[str(key)] = originalDict[str(key)]

#Print out to JSON
3
ytpillai 5 juil. 2019 à 22:36

Celui-ci, ça va:

import json
import collections
a = '''
    {"clips": 
        { 
        "0":{"name": "Please", "id": 1,},
        "1": {"name": "Print", "id": 2,},
        "10": {"name": "me", "id": 3,},
        "2": {"name": "in order", "id": 4,}
    }}
'''

#replace comas before } otherwise json.loads will fail
a = a.replace(',}','}')

#parse json
a = json.loads(a)

#converting keys to int
a['clips'] = {int(k):v for k,v in a['clips'].items()}

#sorting
a['clips'] = collections.OrderedDict(sorted(a['clips'].items()))

print a
1
Dan Lenski 10 juil. 2015 à 21:25