Konvertieren / Zurückgeben von Klassenobjekten in das JSON-Format in Python

Ein Hinweis zum Codieren eines Objekts einer von Ihnen in Python definierten Klasse und zum Decodieren aus dem Json-Format. Referenzierte Seite:

Beispiel

Nehmen Sie diese Klasse als Beispiel.

import json
from datetime import date

class MyA:
    def __init__(self, i=0, d=date.today()):
        self.i = i   #int type
        self.d = d   #Datumstyp

Json-Daten

Zunächst müssen wir uns das Format des Objekts als Json-Daten vorstellen. Es scheint natürlich, dass das MyA-Objekt ein Objekt mit "i" und "würde" als Schlüssel ist. Auch die Datumsangaben können eine Zeichenfolge sein, aber lassen Sie uns sie mit der Toordinal-Methode schnell in eine Ganzzahl konvertieren. Dann zum Beispiel

a = MyA(i=100, d=date(year=2345, month=6, day=12))

Das a definiert als wird in die Json-Daten "{" i ": 100," d ": 856291}" konvertiert. Dies mag in Ordnung sein, kann aber langwierig sein, da Sie nicht wissen, auf welchen Typ Sie beim Dekodieren zurückgreifen sollen. Daher wird der Klassenname im Schlüssel "_type" gespeichert, und der Wert wird im Schlüssel "value" gespeichert. Infolgedessen sehen die Json-Daten folgendermaßen aus:

{ "_type": "MyA", 
  "value": {"i": 100, 
            "d": { "_type": "date",
                   "value": 856291}}}

Kodieren

Die Befehle dump und dumps in Pythons json-Bibliothek verwenden ein Argument namens cls. Hier können Sie Ihren eigenen Encoder angeben. Da JSONEncoder eine häufig verwendete Klasse ist, erstellen Sie darauf basierend Ihren eigenen Encoder. Was Sie wirklich tun müssen, ist eine Methode namens Standard neu zu definieren.

class MyEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, date):
            return {'_type': 'date', 'value': o.toordinal()}
        if isinstance(o, MyA):
            return {'_type': 'MyA', 'value': o.__dict__}
        return json.JSONEncoder.default(self, o)

Wie Sie sehen, müssen Sie nur schreiben, was jede Klasse direkt betrachtet, und die Bibliothek tut das Gute für die Rekursion. (Im Fall eines MyA-Klassenobjekts wird ein Wörterbuch zurückgegeben, und dort können Datumsangaben festgelegt werden.)

Es kann wie folgt ausgeführt werden.

    a = MyA(100, date(year=2345, month=6, day=12))
    js = json.dumps(a, cls=MyEncoder)
    print(js)

Ausführungsergebnis:

{"_type": "MyA", "value": {"i": 100, "d": {"_type": "date", "value": 856291}}}

Dekodieren

Dadurch wird auch ein Decoder erstellt, der auf einer Klasse namens JSONDecoder basiert. Wenn das Objekt der übergeordneten Klasse JSONDecoder erstellt wird, schreiben Sie es dieses Mal so, dass die erforderliche Dekodierung in der an die Variable object_hook übergebenen Funktion ausgeführt wird. Es sieht aus wie das:

class MyDecoder(json.JSONDecoder):
    def __init__(self, *args, **kwargs):
        json.JSONDecoder.__init__(self, object_hook=self.object_hook,
                                  *args, **kwargs)

    def object_hook(self, o):
        if '_type' not in o:
            return o
        type = o['_type']
        if type == 'date':
            return date.fromordinal(o['value'])
        elif type == 'MyA':
            return MyA(**o['value'])

Ab o von object_hook wird das Ergebnis der normalen Decodierung übergeben. Im obigen Beispiel wird ein Wörterbuch mit "_type" und "value" als Schlüssel geliefert, sodass Sie den Code schreiben können, um ihn als Objekt der entsprechenden Klasse neu zu erstellen. Auch hier müssen Sie nicht über rekursive Verarbeitung nachdenken.

Nach der Ausführung zum Zeitpunkt der Codierung:

    b = json.loads(js, cls=MyDecoder)
    print(b.i, b.d)

Ausführungsergebnis:

100 2345-06-12

Recommended Posts

Konvertieren / Zurückgeben von Klassenobjekten in das JSON-Format in Python
Konvertieren Sie das Tweepy Status-Objekt in JSON
Konvertieren Sie Markdown in Python in PDF
Bestimmen Sie das Datums- und Uhrzeitformat mit Python und konvertieren Sie es in Unixtime
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Verwendung von __slots__ in der Python-Klasse
Konvertieren Sie den Python-Datumstyp in das RFC822-Format
Format in Python
In Python von Markdown in HTML konvertieren
Konvertieren Sie die absolute URL in eine relative URL in Python
In der XML-Datenbank (BaseX) gespeichertes XML-Dokument in das CSV-Format konvertieren (mit Python)
Ich habe ein Skript in Python erstellt, um MDD-Dateien in das Scrapbox-Format zu konvertieren
Konvertieren Sie die FBX-Datei in Python in ASCII <-> BINARY
Konvertieren Sie PDFs mit Python in Massenbilder
So generieren Sie ein Python-Objekt aus JSON
[Einführung in Python] Umgang mit Daten im JSON-Format
Unterschied in der Objekt-ID aufgrund des Imports in Python
Konvertieren Sie Daten im JSON-Format in txt (mit yolo)
Konvertieren Sie den exponentiellen Float in Python in str
Konvertieren Sie kubischen Netzcode in Python in WKT
Konvertieren Sie die Zeichenfolge mit Python in ein zeichenweises Listenformat
Umgang mit Json in Python
Bildformat in Python
Objektorientiert in Python
Konvertieren Sie json in Excel
Klassennotation in Python
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Konvertieren Sie Datum und Uhrzeit in Zeitzonen in Unixtime in Python2.7
Ich möchte in Python schreiben! (1) Überprüfung des Codeformats
So konvertieren / wiederherstellen Sie einen String mit [] in Python
[Python] Konvertieren Sie Allzweckcontainer und Klasse ineinander
Konvertieren Sie das NumPy-Array "ndarray" in Python [tolist ()]
Konvertieren Sie die Netzmaske der CIDR-Notation in Python in eine gepunktete Dezimalschreibweise
So konvertieren Sie ein Klassenobjekt mit SQLAlchemy in ein Wörterbuch
[Road to Intermediate Python] Definieren Sie die Funktion __getattr__ in der Klasse
So konvertieren Sie Gleitkommazahlen in Python in Binärzahlen
Konvertieren Sie das Bild in .zip mit Python in PDF
So konvertieren Sie eine JSON-Datei mit Python Pandas in eine CSV-Datei
Ausgabeprotokoll im JSON-Format mit Python-Standardprotokollierung
Konvertieren Sie die asynchrone API im Callback-Stil in async / await in Python
[Road to Intermediate Python] Definieren Sie in Ihrer eigenen Klasse
[Python] Erstellt eine Methode zum Konvertieren von Radix in 1 Sekunde
So konvertieren Sie Json-Dateien in das CSV- oder EXCEL-Format
Konvertieren Sie den Webpay-Entitätstyp in den Dict-Typ (rekursiv in Python).
Konvertieren Sie die XML-Datei im Pascal-VOC-Format in die JSON-Datei im COCO-Format
Umgang mit JSON in Ruby, Python, JavaScript, PHP
Verwenden Sie Slackbot als Relais und kehren Sie im JSON-Format von Flasche zu Slack zurück.
[Python] Datum in Zeichenfolge konvertieren
So löschen Sie stdout in Python
Konvertieren Sie numpy int64 in python int
[Python] Liste in Pandas konvertieren [Pandas]
String-Objektmethoden in Python
Nullobjektvergleich in Python
Melden Sie sich auf der Website in Python an
Analysieren Sie die JSON-Datei zum Objekt
[Python] Konvertieren Sie Shift_JIS in UTF-8
Konvertieren Sie die CIDR-Notation in Python