In base a this conversion table, gli integer di Python vengono scritti come numeri JSON se serializzati utilizzando il modulo JSON, come mi aspetto e desidero.Perché le chiavi int di un python dict si trasformano in stringhe quando si usa json.dumps?
Ho un dizionario con una chiave intero e intero valore:
>>> d = {1:2}
>>> type(d.items()[0][0])
<type 'int'>
>>> type(d.items()[0][1])
<type 'int'>
Quando uso il modulo JSON per serializzare questo in una stringa JSON, il valore viene scritto come un numero, ma la chiave è scritto come una stringa:
>>> json.dumps(d)
'{"1": 2}'
Questo non è il comportamento che voglio, e sembra particolarmente rotto in quanto si rompe json.dumps/json.loads tutto l'intervento:
>>> d == json.loads(json.dumps(d))
False
Perché ciò accade e c'è un modo in cui posso forzare la chiave a essere scritta come un numero?
Le chiavi JSON sono * sempre * stringhe. – duffymo
... e JSON utilizza stringhe perché sono indipendenti dall'ordine dei byte. – martineau
Se JSON non è * rigorosamente * richiesto, si può andare su YAML usando invece PyYAML: 'd = {1: 2, 3: 4}; import yaml; yaml.safe_load (yaml.safe_dump (d)) == d' restituisce True. In generale lo stile "in linea" di YAML sembra più flessibile JSON (le chiavi possono essere numeri, le stringhe di solito non devono essere citate). Io uso 'safe_load' qui perché il normale' yaml.load' ha caratteristiche (costruzione di classi, ecc.) Che è difficile da proteggere correttamente; 'safe_load | dump' limita il set di input/output supportati ai tipi primitivi (bool, int, float, string, list, set, dict) e quindi sono sicuri da utilizzare su input arbitrari. – kampu