Wie konvertiert man ein Objekt, das DateTime-Felder enthält, in JSON in Dart?

8

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?

    
SergeyT 14.05.2013, 07:10
quelle

2 Antworten

3

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.

    
Florian Loitsch 16.02.2014 18:04
quelle
1

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:

  • Umbruch (oder Ableitung von) DateTime in Ihrem eigenen Typ, der toJson liefert
  • patch json.stringifyJsonValue und senden Sie die Änderung oder senden Sie mindestens ein Problem:)
  • Verwenden Sie eine Bibliothek von Drittanbietern wie json-object (nur ein Beispiel, es unterstützt auch nicht DateTime Serialisierung, AFAIK

Ich bin nicht wirklich glücklich mit ihnen:)

    
Zdeslav Vojkovic 14.05.2013 09:21
quelle

Tags und Links