webentwicklung-frage-antwort-db.com.de

Liste der JSON-Objekte mit Python

Ich habe Probleme beim Konvertieren von Object-Instanzen in 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

In list_name habe ich eine Liste von Object-Instanzen.

json_string return, zum Beispiel:

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

Ich möchte jedoch nur einen JSON-String mit allen Informationen in einer Liste:

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

Sie können ein Listenverständnis verwenden, um eine Liste mit Wörterbüchern zu erstellen und diese anschließend zu konvertieren:

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

oder verwenden Sie eine default-Funktion; json.dumps() ruft es für alles auf, was es nicht serialisieren kann:

def obj_dict(obj):
    return obj.__dict__

json_string = json.dumps(list_name, default=obj_dict)

Letzteres funktioniert für Objekte, die auf einer beliebigen Strukturebene eingefügt werden, nicht nur in Listen.

56
Martijn Pieters

Eine andere mögliche Lösung für dieses Problem ist jsonpickle , mit dem jedes Python-Objekt in JSON (nicht nur in einfachen Listen) umgewandelt werden kann.

Von der jsonpickle - Startseite:

jsonpickle ist eine Python-Bibliothek für die Serialisierung und Deserialisierung von komplexen Python-Objekten in und aus JSON. Der Standard-Python Bibliotheken zum Kodieren von Python in JSON, z. B. json der Stdlib, simplejson und demjson können nur mit Python-Primitiven umgehen, die ein .__ haben. Direktes JSON-Äquivalent (z. B. Diktate, Listen, Strings, Ints usw.) . jsonpickle baut auf diesen Bibliotheken auf und ermöglicht komplexere Datenstrukturen, die zu JSON serialisiert werden sollen. Jsonpickle ist hoch konfigurierbar und erweiterbar - so kann der Benutzer die JSON .__ auswählen. Backend und fügen Sie weitere Backends hinzu.

Eine Transformation durchzuführen ist einfach:

import jsonpickle

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

Ähnlich wie bei der Antwort von @MartijnPieters können Sie den Parameter json.dumps default mit einem Lambda verwenden, wenn Sie keine separate Funktion erstellen möchten: json.dumps(obj, default = lambda x: x.__dict__)

0
Eric Romrell