Ich habe einen Typ, der ein Wrapper über ein Wörterbuch ist - im Grunde ein Schlüssel / Wert-Speicher. Ich möchte ein Array von Objekten dieses Typs zu JSON serialisieren. Ich bin ziemlich neu in JSON und Json.NET (newtonsoft.json).
Mein Typ hat eine Methode namens - ToJson, die ihr Wörterbuch wie folgt in json serialisiert:
%Vor%Und dann versuche ich ein Array dieser Objekte zu serialisieren
%Vor%Natürlich funktioniert das nicht, weil jedes Objekt im Array serialisiert ist und ich nicht weiß, wie ich den Serialisierungsprozess für jedes Objekt auf meine 'ToJson'-Methode richten soll.
Ich kann es genau so ausführen, wie ich es möchte, wenn ich ein Array von Dictionary-Objekten übergebe.
Vielleicht fehlen mir einige Serialisierungsattribute?
BEARBEITEN:
Nachdem ich einige weitere Dokumente gelesen hatte, versuchte ich einen kürzeren Weg (bevor ich den Ansatz von JsonConverter in Betracht zog) - mit dem 'JsonPropertyAttribute'. Die Anwendung auf das private Dictionary-Mitglied hat fast den Job gemacht, außer dass ich auch den Mitgliedsnamen serialisiert bekomme, was ich nicht möchte. Gibt es eine Möglichkeit, den Elementwert und nicht den Elementnamen nur mithilfe des JsonPropertyAttribute zu serialisieren?
Um Ihre Wrapper-Klasse so zu serialisieren, dass ihr internes Wörterbuch im JSON erscheint, als ob der Wrapper nicht vorhanden wäre, benötigen Sie eine benutzerdefinierte JsonConverter
. A JsonConverter
gibt Ihnen direkte Kontrolle darüber, was für eine bestimmte Klasse serialisiert und / oder deserialisiert wird.
Unten ist ein Konverter, der für Ihren Fall funktionieren sollte. Da Sie wirklich keine Details über Ihre Wrapper-Klasse angegeben haben, außer dass sie ein Feld namens values
enthält, um das Wörterbuch zu speichern, habe ich Reflektion verwendet, um darauf zuzugreifen. Wenn Ihre Klasse über öffentliche Methoden verfügt, um das Wörterbuch direkt zu bearbeiten, können Sie den Konverter ändern, um diese Methoden stattdessen zu verwenden. Hier ist der Code:
Um den benutzerdefinierten Konverter an Ihre Wrapper-Klasse anzubinden, können Sie der class-Definition ein [JsonConverter]
-Attribut hinzufügen:
Hier ist eine vollständige Demo, die den Konverter in Aktion zeigt, zuerst eine einzelne Instanz der Wrapper-Klasse serialisiert und deserialisiert und dann eine Liste von Wrappern serialisiert und deserialisiert:
%Vor%Ausgabe:
%Vor%Versuchen Sie es mit einem beliebigen Objekt. Es ist ein generischer JSON Serializer Code, den ich benutze
%Vor%