Deserialisieren polymorphe json-Klassen ohne Typ Informationen Verwendung json.net
Diese Imgur-api Aufruf gibt eine Liste, die sowohl Galerie Bild und Galerie Album Klassen dargestellt in JSON.
Ich kann nicht sehen, wie deserialisiert werden diese automatisch mit Json.NET da gibt es kein $type-Eigenschaft sagen, die deserializer, die Klasse soll dargestellt werden. Gibt es eine Eigenschaft namens "IsAlbum", die verwendet werden können, zwischen den beiden zu unterscheiden.
Diese Frage scheint zu zeigen, eine Methode, aber es sieht ein bisschen wie ein hack.
Wie gehe ich über die Deserialisieren diese Klassen? (mit C#, Json.NET).
Beispieldaten:
Galerie Bild
{
"id": "OUHDm",
"title": "My most recent drawing. Spent over 100 hours.",
...
"is_album": false
}
Galerie Album
{
"id": "lDRB2",
"title": "Imgur Office",
...
"is_album": true,
"images_count": 3,
"images": [
{
"id": "24nLu",
...
"link": "http://i.imgur.com/24nLu.jpg"
},
{
"id": "Ziz25",
...
"link": "http://i.imgur.com/Ziz25.jpg"
},
{
"id": "9tzW6",
...
"link": "http://i.imgur.com/9tzW6.jpg"
}
]
}
}
Sie möchten den Json-string und setzen Sie es in den Klassen? Und ich bin verwirrt, was meinst du
Ja, ich habe den json-string und möchten Deserialisieren zu C# - Klassen. Json.NET scheint eine Eigenschaft namens $Art zu zeichnen eine Unterscheidung zwischen unterschiedlichen Typen statt in einem array. Diese Daten werden nicht über diese Eigenschaft und verwendet einfach die 'IsAlbum' - Eigenschaft.
there is no $type property
.Ja, ich habe den json-string und möchten Deserialisieren zu C# - Klassen. Json.NET scheint eine Eigenschaft namens $Art zu zeichnen eine Unterscheidung zwischen unterschiedlichen Typen statt in einem array. Diese Daten werden nicht über diese Eigenschaft und verwendet einfach die 'IsAlbum' - Eigenschaft.
InformationsquelleAutor Peter Kneale | 2013-10-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies tun, ziemlich leicht durch erstellen einer benutzerdefinierten
JsonConverter
zu behandeln den Objekt-Instanziierung. Vorausgesetzt, Sie haben Ihre Klassen definiert, so etwas wie dieses:Erstellen Sie den Konverter wie diesem:
Hier ist ein Beispiel-Programm zeigt der Konverter in Aktion:
Und hier ist die Ausgabe des obigen Programms:
Perfekt, das hat wunderbar funktioniert!
Für jeden, der versucht, aus diesem Ansatz und finden es entsteht eine unendliche Schleife (und irgendwann einen stack-overflow) Sie möchten möglicherweise verwenden Sie das
Populate
Ansatz stattToObject
. Siehe die Antworten zu den stackoverflow.com/questions/25404202/... und stackoverflow.com/questions/29124126/... . Ich habe ein Beispiel der beiden Ansätze in einer Zusammenfassung hier: gist.github.com/chrisoldwood/b604d69543a5fe5896a94409058c7a95 .Ich war verloren in verschiedenen Antworten über 8 Stunden, waren Sie über CustomCreationConverter. Endlich ist dieser Antwort gearbeitet und ich fühle mich erleuchtet. Meine innere Objekt enthält es wird der Typ als string, und ich es verwenden, um die Konvertierung wie diese. JObject item = JObject.Load(reader); Type type = Type.GetType(item["Typ"].Wert<Zeichenfolge>()); return Element.ToObject ();
Dies funktioniert gut für mich, vorausgesetzt, dass Sie nicht die Konverter-Attribut der Basisklasse. Den Konverter injiziert werden muss, in das Serialisierungsprogramm (über Einstellungen etc) und überprüfen Sie für nur der Basis-Typ in CanConvert. Ich bin debattieren mit Füllen (), aber ich weiß wirklich nicht, wie entweder Methode.
InformationsquelleAutor Brian Rogers
Einfach mit JsonSubTypes Attribute, die Arbeit mit Json.NET
InformationsquelleAutor manuc66
Folgende Implementierung sollte Sie de-serialisieren, ohne änderung der Art, die Sie entwickelt haben, Ihre Klassen und mit einem anderen Bereich als $geben zu entscheiden, was zu de-serialisieren.
InformationsquelleAutor Abdul Rehman Gill
Erweitert, um Brian Rogers Antwort. Und über "Serializer verwenden.Auffüllen() anstatt Element.ToObject()".
Wenn abgeleitete Typen hat contstructors oder einige Ihrer eigenen customconverter müssen Sie allgemein für JSON Deserialisieren.
So müssen Sie die Arbeit verlassen, für neues Objekt instanziieren zu NewtonJson. Auf diese Weise können Sie erreichen, in der Sie CustomJsonConverter:
Diese funktionieren, wenn du die Rekursion von Objekten.
serializer.ContractResolver.ResolveContract(DeterminedType) - Rückkehr bereits zwischengespeichert Vertrag. So Vertrag.Converter = null; ändern zwischengespeicherte Objekt. Es nur ändern, Verweis-Cache-Objekt, und es ist thread-sicher.
InformationsquelleAutor Игорь Орлов
Ich bin nur dieses posting zu klären einige der Verwirrung. Wenn Sie arbeiten mit einem vordefinierten format und müssen Deserialisieren, dies ist, was ich gefunden habe besten funktioniert und zeigt, dass die mechanik ein, so dass andere tweak es als notwendig.
[FromBody]
- Attribut?Ich nehme an, Sie können einfach Bearbeiten Sie die globalen JsonFormatter die Einstellungen für diesen Konverter. Siehe stackoverflow.com/questions/41629523/...
Oh genial - vielen Dank.
InformationsquelleAutor xtravar