2013-06-14 20 views
24

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?

+4

Le chiavi JSON sono * sempre * stringhe. – duffymo

+2

... e JSON utilizza stringhe perché sono indipendenti dall'ordine dei byte. – martineau

+3

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

risposta

31

La semplice ragione è che JSON does not allow integer keys.

object 
    {} 
    { members } 
members 
    pair 
    pair , members 
pair 
    string : value # Keys *must* be strings. 

Quanto al modo per aggirare questa limitazione - è necessario prima di assicurare che l'attuazione di ricezione in grado di gestire il JSON tecnicamente valido. Quindi è possibile sostituire tutte le virgolette o utilizzare un serializzatore personalizzato.

+1

E a differenza del semplice javascript. tutte le chiavi dovrebbero essere citate –

Problemi correlati