2012-07-10 23 views
7

Quiero que Python's None se codifique en json como cadena vacía, ¿cómo? A continuación se muestra el comportamiento predeterminado de json.dumps.Python: ¿Cómo json vacía Ninguno para vaciar la cadena

>>> import json 
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) 
'["foo", {"bar": ["baz", null, 1.0, 2]}]' 

¿Debo sobrescribir el método codificador JSON o hay alguna otra manera?

Gracias!

Editar

los datos de entrada no es tan simple como en el ejemplo anterior, en cada petición podría ser cambiado a diferente estructura de datos. Es difícil escribir una función para cambiar la estructura de datos.

+2

Si quieres la respuesta real, entonces necesitarás proporcionar una mejor justificación ... –

+0

Mi información de entrada no es tan simple como en el ejemplo anterior, por lo que estoy buscando cambiar el 'Ninguno' por una cadena vacía a través de 'json.dumps'. – Ahsan

+1

Debe tenerse en cuenta que 'None' no es lo mismo que una cadena vacía; así que tenlo en cuenta cuando conviertas. El equivalente correcto de 'None' es' nulo' –

Respuesta

8

En el objeto que está codificando, use una cadena vacía en lugar de None.

Aquí hay una función no probada que recorre una serie de diccionarios anidados para cambiar todos los valores de None a ''. Agregar soporte para listas y tuplas se deja como un ejercicio para el lector. :)

import copy 

def scrub(x): 
    ret = copy.deepcopy(x) 
    # Handle dictionaries. Scrub all values 
    if isinstance(x, dict): 
     for k,v in ret.items(): 
      ret[k] = scrub(v) 
    # Handle None 
    if x == None: 
     ret = '' 
    # Finished scrubbing 
    return ret 
3

Sería mejor para procesar los datos que desea codificar y reemplazar None s con cadenas vacías. Después de todo, eso es lo que quieres.

2

Aquí es una versión ligeramente mejorada que se encarga de las listas y tuplas así:

def scrub(x): 
    # Converts None to empty string 
    ret = copy.deepcopy(x) 
    # Handle dictionaries, lits & tuples. Scrub all values 
    if isinstance(x, dict): 
     for k, v in ret.items(): 
      ret[k] = scrub(v) 
    if isinstance(x, (list, tuple)): 
     for k, v in enumerate(ret): 
      ret[k] = scrub(v) 
    # Handle None 
    if x is None: 
     ret = '' 
    # Finished scrubbing 
    return ret 

que lo utilizaron cuando se utiliza jsonschmea módulo. Parece que no puede manejar el tipo None, y arroja: jsonschema.exceptions.ValidationError: None is not of type u'string'. Entonces esto soluciona el problema.

Cuestiones relacionadas