Fügen Sie die JSON-serializer zu jedem model-Klasse?

Wenn es um die JSON-Kodierung in Dart pro Seth Ladd ' s accouncement die endlich genehmigt, jetzt den offiziellen Weg zu gehen, ist dart:convert + JSON.Encode.

Sagen wir, wir haben eine Reihe von Modell-Klassen (PODOs), wie z.B.:

class Customer
{
  int Id;
  String Name;
}

Nun, ich würde lieben im Stande zu sein, nur JSON-encode meine domain-Objekte wie diese:

var customer = new Customer()
  ..Id = 17
  ..Name = "John";
var json = JSON.encode(customer);

Leider funktioniert es nicht...

Uncaught Error: Converting object to an encodable object failed.
Stack Trace: 
#0      _JsonStringifier.stringifyValue (dart:convert/json.dart:416)
#1      _JsonStringifier.stringify (dart:convert/json.dart:336)
#2      JsonEncoder.convert (dart:convert/json.dart:177)
....

... es sei denn, wir hätten ausdrücklich sagen dart:convert codieren:

class Customer
{
  int Id;
  String Name;

  Map toJson() { 
    Map map = new Map();
    map["Id"] = Id;
    map["Name"] = Name;
    return map;
  }  
}

Muss ich wirklich haben, um eine toJson Methode, um jeden einzelnen von meinen model-Klassen, oder gibt es eine bessere Möglichkeit?

BEARBEITEN: das ist die einfache Serialisierung, ich bin auf der Suche nach:

{
    "Id": 17,
    "Name": "John"
}

Vergleichen, um ToJson im ServiceStack.Text, zum Beispiel.

Dart Serialisierung - Bibliothek (siehe Matt B ' s Antwort weiter unten) scheint wie ein Schritt in die richtige Richtung. Jedoch, diese ...

var serialization = new Serialization()
  ..addRuleFor(Customer); 
var json = JSON.encode(serialization.write(customer, format: new SimpleJsonFormat()));

... produziert nur ein array mit den Werten (keine Tasten):

[17,"John"]

Verwendung der Standard - SimpleMapFormat auf der anderen Seite erzeugt diese komplexe Darstellung.

Still haven 'T found what I' m looking for...

EDIT 2: Hinzufügen von etwas Kontext: ich Baue einen RESTful web-service in Dart, und ich bin auf der Suche nach einem JSON-Serialisierung, die leicht konsumiert werden, von jedem client, nicht nur ein anderes Dart-client. Zum Beispiel, die Abfrage der Stack-Exchange-API für diese Frage zu erstellen dieser JSON-Antwort. Dies ist das Serialisierungsformat ich bin auf der Suche nach. - Oder, schauen Sie bei typischen JSON-Antworten zurückgegeben von der Twitter-REST-API oder die Facebook Graph API.

EDIT 3: ich schrieb eine kleine blog-post über diese. Siehe auch die Diskussion auf Hacker News.

  • Kleiner Hinweis: die JSON-Konverter verwendet .toJson standardmäßig, aber Sie können konfigurieren, die toEncodable Funktion.
  • Warum nicht die Ausgabe von Serialisierung, was du suchst?
  • denn es kann nicht einfach konsumiert werden, indem eine nicht-Dart-client. Siehe EDIT 2 oben.
  • irgendwelche Pläne, entweder um es möglich zu machen, um Leistung aus Serialisieren, wie Max schrieb, oder noch besser, die Unterstützung von Json.decodieren für die Klassen automatisch? Wenn Nein, würden Sie vorschlagen, die Lösung mit der "exportierbar" Bibliothek?
  • Leider gibt es keine universal-JSON-Serialisierung von Objekten für alle Plattformen. Was auch immer Dart-picks, wird jemand etwas anderes wollen. 🙁 Das ist der Grund, warum die Serialisierungs-Bibliothek gibt Ihnen so viel Kontrolle: Sie können die Ausgabe genau, was Sie wollen. Ich habe nicht versucht, den exportable Bibliothek, aber ich sollte.
  • Tnx! Gibt es eine einfache Möglichkeit erzeugen ein format, wie Max schrieb, mit einer speziellen Formater. Haben Sie einen Tipp oder ein Beispiel, wie zu schreiben, wie eine Formater
  • Ich bin wirklich enttäuscht, dass etwas, das trivial und wichtig für fast alle REST-basierte Anwendungen nicht gut mit der dart. Ich verbringe Stunden über Stunden mit der Lösung von Problemen, warum Ein Objekt in der Lage ist, bis gemarshallt werden, die von der JSON.encode-Methode und ein anderer nicht. Und don ' T let me get started über die Erstellung der toMap Sachen für jede Klasse. Das treibt mich in den Wahnsinn.

InformationsquelleAutor Max | 2013-11-16
Schreibe einen Kommentar