web-dev-qa-db-fra.com

Liste d'objets au format JSON avec Python

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"}]
19
pedro

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.

56
Martijn Pieters

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)
3
Steven Wolfe

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__)

0
Eric Romrell