Ich versuche ein Objekt in JSON zu konvertieren.
%Vor%Die Laufzeitumgebung löst eine Ausnahme aus: "Aufruf der Methode json für Objekt fehlgeschlagen."
Dies wird erwartet, da die DateTime-Klasse nicht die Methode toJson hat. Aber was soll ich in diesem Fall tun?
Die Funktion JSON.stringify
von Javascript hat ein optionales Argument replacer , das es mir ermöglicht, meine eigene Art der Serialisierung eines beliebigen Objekts bereitzustellen, selbst wenn das Objekt keine toJson-Methode hat. Gibt es eine ähnliche Funktion in Dart oder kann ich die DateTime-Klasse irgendwie mit meiner eigenen toJson-Methode erweitern?
Zdeslav Vojkovics Antwort ist jetzt veraltet.
Die JSON.encode()
-Methode in dart:convert
hat eine optionale toEncodable
-Methode, die für Objekte aufgerufen wird, die nicht nativ für JSON serialisiert werden können. Es liegt dann am Benutzer, eine Schließung bereitzustellen, die eine entsprechende Serialisierung der DateTime zurückgibt.
IMO, es ist ein Fehler in dart:json
library, dass stringify
keinen zusätzlichen Callback unterstützt, um Typen zu serialisieren, denen die Implementierung von toJson
fehlt. Seltsamerweise unterstützt die Funktion parse
das Argument reviver
, um den Deserialisierungsprozess anzupassen. Wahrscheinlich lag der Grund darin, dass der Benutzer toJson
für seine On-Typen hinzufügen kann und die Core-Bibliothek sich um "native" Typen kümmern wird, aber DateTime
wurde weggelassen (vielleicht, weil die Datumsserialisierung in JSON keine einfache Geschichte ist) ).
Vielleicht war das Ziel des Teams, benutzerdefinierte Typen anstelle von Maps zu verwenden (was nett ist), aber der Nachteil hier ist, dass wenn Ihr benutzerdefinierter Typ 10 andere Eigenschaften und 1 vom DateTime
-Typ enthält, müssen Sie Implementiere toJson
, die alle von ihnen serialisiert, sogar ganze Zahlen und Strings. Wenn die Mirror-API bereit ist, gibt es hoffentlich Bibliotheken, die die Serialisierung "Out-of-Band" implementieren, indem sie den reflektierten Info-Typ lesen, siehe unten für ein Beispiel. Das Versprechen von Dart ist, dass ich meine Typen sowohl auf dem Server als auch auf dem Client verwenden könnte, aber wenn ich die Serialisierung / Deserialisierung für alle meine Modelle manuell implementieren muss, ist es zu peinlich, um verwendbar zu sein.
Es hilft auch nicht, dass DateTime
selbst nicht sehr flexibel bei der Formatierung ist, da es außer toString
keine anderen Methoden gibt, die das für die Serialisierung nutzlose Format zurückgeben.
Hier sind einige Optionen:
DateTime
in Ihrem eigenen Typ, der toJson
liefert
json.stringifyJsonValue
und senden Sie die Änderung oder senden Sie mindestens ein Problem:) json-object
(nur ein Beispiel, es unterstützt auch nicht DateTime
Serialisierung, AFAIK Ich bin nicht wirklich glücklich mit ihnen:)