J'ai un problème pour convertir les instances Object
en 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
Dans list_name
, j'ai une liste d'instances Object
.
json_string
return, par exemple:
{"city": "rouen", "name": "1, 2, 3 Soleil"}
{"city": "rouen", "name": "Maman, les p'tits bateaux"}
Mais je voudrais juste 1 chaîne JSON avec toutes les informations dans une liste:
[{"city": "rouen", "name": "1, 2, 3 Soleil"}, {"city": "rouen", "name": "Maman, les p'tits bateaux"}]
Vous pouvez utiliser une compréhension de liste pour produire une liste de dictionnaires, puis convertir celle-ci:
json_string = json.dumps([ob.__dict__ for ob in list_name])
ou utilisez une fonction default
; json.dumps()
l'appellera pour tout ce qu'il ne peut pas sérialiser:
def obj_dict(obj):
return obj.__dict__
json_string = json.dumps(list_name, default=obj_dict)
Ce dernier fonctionne pour les objets insérés à n'importe quel niveau de la structure, pas seulement dans les listes.
Une autre solution possible à ce problème est jsonpickle , qui peut être utilisé pour transformer n'importe quel objet Python en JSON (pas seulement de simples listes).
Depuis la page d'accueil jsonpickle:
jsonpickle est une bibliothèque Python pour la sérialisation et la désérialisation d’objets Python complexes vers et depuis JSON. Le Python standard bibliothèques pour coder Python en JSON, telles que le fichier json, .__ de stdlib. simplejson et demjson ne peuvent gérer que les primitives Python ayant un équivalent JSON direct (par exemple, dict, listes, chaînes, entiers, etc.) . jsonpickle construit au-dessus de ces bibliothèques et permet des tâches plus complexes structures de données à sérialiser en JSON. Jsonpickle est fortement configurable et extensible - permettant à l'utilisateur de choisir le JSON backend et ajouter des backends supplémentaires.
Effectuer une transformation est simple:
import jsonpickle
class JsonTransformer(object):
def transform(self, myObject):
return jsonpickle.encode(myObject, unpicklable=False)
Semblable à la réponse de @MartijnPieters, vous pouvez utiliser le paramètre json.dumps default
avec un lambda, si vous ne souhaitez pas créer une fonction distincte:
json.dumps(obj, default = lambda x: x.__dict__)