2012-08-02 6 views
11

Tengo una lista, que puede estar vacía o no.Obligar a json a volcar un objeto json incluso cuando la lista está vacía

Quiero crear un nuevo archivo que contenga esa lista en un formato que sea legible por el ser humano y fácil de analizar para mi próximo script. En el caso en que la lista no esté vacía, esto funciona bien y mi próximo script se lee en el archivo json. Pero cuando la lista está vacía, obtengo "ValueError: ningún objeto JSON podría decodificarse". Esto tiene sentido, porque cuando abro el archivo, de hecho no hay contenido y, por lo tanto, no hay objeto JSON.

Estoy de acuerdo con el hecho de que algunas listas están vacías. Entonces, o quiero escribir un objeto JSON vacío o quiero que mi script de lectura esté bien sin encontrar un objeto JSON.

Aquí está el código correspondiente:

guionista

favColor = [] OR favColor = ['blue'] OR favColor = ['blue', 'green'] 
fileName = 'favoriteColor.json' 
outFile = open(fileName, 'w') 
json.dump(outFile, favColor) 
outFile.close() 

lector de guiones

fileName = 'favoriteColor.json' 
inFile = open(fileName, 'r') 
colors = json.load(inFile) 
inFile.close() 

Cualquier ayuda o sugerencia muy apreciados. Si necesito proporcionar más razones de por qué estoy haciendo esto, también puedo proporcionarlo, solo pensé que comenzaría con el mínimo necesario para comprender el problema.

Respuesta

15

Modificar la secuencia de comandos lector a esto:

with open('favoriteColor.json') as inFile: 
    try: 
     colors = json.load(inFile) 
    except ValueError: 
     colors = [] 

Este intenta cargar el archivo como JSON. Si falla debido a un error de valor, sabemos que esto se debe a que el json está vacío. Por lo tanto, podemos simplemente asignar colores a una lista vacía. También es preferible utilizar el constructo "con" para cargar archivos, ya que los cierra automáticamente.

+0

Agradable y limpio +1 –

+0

Gracias, muy apreciado, y una buena explicación de por qué es preferible "con abrir() como ...". He escuchado a la gente decir que es preferible antes, pero sin la razón nunca me hizo cambiar. – rcorty

2

No tomaría el enfoque que estás intentando. En vez de ello json.dump un diccionario, por ejemplo:

d = {'var1': '123', 'var2': [1, 2, 3]} 
json.dump(d, fileout) 

A continuación, utilice dict.get por defecto a un valor adecuado:

json_dict = json.load(filein) 
favColor = json_dict.get('favColor', []) 

Entonces todavía tienen valores obligatorios que pueden Excepto si no está presente el uso de [] notación.

pone a la lógica de los valores que faltan en su código en lugar de los analizadores JSON ...

2

También puede agregar el nombre de la variable en el archivo JSON:

json.dump({'favorite-color': favColor}, outFile) 
outFile.close() 

Y manejar el caso de una lista vacía al leer el archivo JSON:

data = json.load(inFile) 

if len(data['favorite-color']) == 0: 
    ... 

Tenga en cuenta que debe proporcionar el objeto que desea guardar y luego el objeto de fichero a json.dump.

Cuestiones relacionadas