2010-08-23 7 views
6

Volcar y cargar un dict con Ninguno como clave, resulta en un dict con "nulo" como clave.Python + JSON, ¿qué le pasó a None?

Los valores no están afectados, pero las cosas empeoran si realmente existe una clave de cadena "nula".

¿Qué estoy haciendo mal aquí? ¿Por qué no puedo serializar/deserializar un dict con las teclas "Ninguno"?

Ejemplo

>>> json.loads(json.dumps({'123':None, None:'What happened to None?'})) 
{u'123': None, u'null': u'What happened to None?'} 
>>> json.loads(json.dumps({'123':None, None:'What happened to None?', 'null': 'boom'})) 
{u'123': None, u'null': u'boom'} 
+1

La salida de Btw del segundo código parece haber sido manipulada. –

Respuesta

17

objetos JSON son mapas de cuerdas a los valores. Si intenta utilizar otro tipo de clave, se convertirán en cadenas.

>>> json.loads(json.dumps({123: None})) 
{'123': None} 
>>> json.loads(json.dumps({None: None})) 
{'null': None} 
10

Según la specification, None no es una clave válida. Se equivaldría a una expresión de objeto JSON, que se parece

{ ..., null: ..., ... } 

que no es válido (es decir, no se pueden generar utilizando el diagrama de sintaxis.)

Podría decirse que el módulo de JSON debería haber planteado una excepción a serialización en lugar de generar silenciosamente una representación de cadena del valor.

EDITAR acabamos de ver, que el comportamiento del módulo es documented (algo implícitamente):

Si skipkeys es cierto (por defecto: falso), teclas y dict que no son de un tipo básico (str, unicode, int, long, float, bool, None) se omitirán en lugar de generar un TypeError.

por lo que parece, como si este comportamiento es intencional (todavía me resulta cuestionable dada la especificación JSON actual).

+1

skipKeys no tiene un efecto en el comportamiento observado. "Ninguno" es un tipo básico, por lo que skipKeys = True no provocará un "salto", ya que skipKeys = False no causa un TypeError. Me hubiera gustado una pequeña nota en la documentación, algo así como: "Para la codificación reversible, solo use cadenas como teclas". – safl

-1

As @ dan04 muestra, Ninguno se convierte en 'nulo'.
Todo está bien, el valor se almacena en el dict con "null: '¿Qué pasó con None?'"

Pero luego vino otra clave con 'nulo'.
Así que el valor anterior con None/'null'-Key ("¿Qué pasó con None?") Se sobrescribe con "boom".

+0

¿Por qué los votos a favor, qué pasa con esta respuesta? –

Cuestiones relacionadas