Lista de objetos a JSON con Python

Tengo un problema al convertir instancias de Object a JSON:

 ob = Object() list_name = scaping_myObj(base_url, u, number_page) for ob in list_name: json_string = json.dumps(ob.__dict__) print json_string 

En list_name tengo una lista de instancias de Object .

json_string return, por ejemplo:

 {"city": "rouen", "name": "1, 2, 3 Soleil"} {"city": "rouen", "name": "Maman, les p'tits bateaux"} 

Pero me gustaría solo 1 cadena JSON con toda la información en una lista:

 [{"city": "rouen", "name": "1, 2, 3 Soleil"}, {"city": "rouen", "name": "Maman, les p'tits bateaux"}] 

Puede usar una lista de comprensión para producir una lista de diccionarios, luego convertirla:

 json_string = json.dumps([ob.__dict__ for ob in list_name]) 

o usar una función por default ; json.dumps() lo llamará para cualquier cosa que no pueda serializar:

 def obj_dict(obj): return obj.__dict__ json_string = json.dumps(list_name, default=obj_dict) 

El último funciona para objetos insertados en cualquier nivel de la estructura, no solo en listas.

Otra solución posible a este problema es jsonpickle, que se puede usar para transformar cualquier objeto Python en JSON (no solo en listas simples).

Desde la página de inicio de jsonpickle :

jsonpickle es una biblioteca de Python para la serialización y deserialización de objetos Python complejos desde y hacia JSON. Las bibliotecas estándar de Python para codificar Python en JSON, como json, simplejson y demjson de stdlib, solo pueden manejar primitivas de Python que tienen un equivalente directo de JSON (por ejemplo, dictados, listas, cadenas, intts, etc.). jsonpickle se basa en estas bibliotecas y permite que las estructuras de datos más complejas se serialicen a JSON. jsonpickle es altamente configurable y ampliable, lo que permite al usuario elegir el backend de JSON y agregar backends adicionales.

Realizar una transformación es simple:

 import jsonpickle class JsonTransformer(object): def transform(self, myObject): return jsonpickle.encode(myObject, unpicklable=False) 

Al igual que en la respuesta de @MartijnPieters, puede utilizar el parámetro default json.dumps con un lambda, si no desea tener que crear una función separada: json.dumps(obj, default = lambda x: x.__dict__)