Wie deserialisiert man eine Sammlung mit verschiedenen Typen?
Ich habe einen JSON-Feed, der so aussieht (ich habe einige Felder entfernt, die für dieses Beispiel nicht erforderlich sind):
{
"total_count": 2,
"num_pages": 1,
"current_page": 1,
"balance": {
"amount": "0.00001199",
"currency": "BTC"
},
"transactions": [
{
"transaction": {
"id": "5018f833f8182b129c00002f",
"created_at": "2012-08-01T02:34:43-07:00",
"sender": {
"id": "5011f33df8182b142400000e",
"name": "User Two",
"email": "[email protected]"
},
"recipient": {
"id": "5011f33df8182b142400000a",
"name": "User One",
"email": "[email protected]"
}
}
},
{
"transaction": {
"id": "5018f833f8182b129c00002e",
"created_at": "2012-08-01T02:36:43-07:00",
"hsh": "9d6a7d1112c3db9de5315b421a5153d71413f5f752aff75bf504b77df4e646a3",
"sender": {
"id": "5011f33df8182b142400000e",
"name": "User Two",
"email": "[email protected]"
},
"recipient_address": "37muSN5ZrukVTvyVh3mT5Zc5ew9L9CBare"
}
}
]
}
Es gibt zwei Arten von Transaktionen in diesem Feed: interne Transaktionen mit einemrecipient
und externe Transaktionen mit ahsh
undrecipient_address
.
Ich habe die folgenden Klassen erstellt, um diese Struktur aufzunehmen:
Wir haben also eine Basisklasse für alle ausgelagerten Ergebnisse (PagedResult
) mit einer spezifischen Implementierung für Transaktionen (TransactionPagedResult
). Dieses Ergebnis enthält eine Auflistung mit 0 .. * Transaktionen (abstrakte KlasseTransaction
). Sie sind nicht vom TypTransaction
obwohl, aber vom TypInternalTransaction
oderExternalTransaction
welche Implementierungen vonTransaction
.
Meine Frage ist, wie ich JSON.NET damit umgehen kann. Ich möchte, dass JSON.NET erkennt, ob es sich bei der aktuellen Transaktion, die analysiert wird, um eine handeltInternalTransaction
oder einExternalTransaction
, und fügen Sie den entsprechenden Typ dem hinzuIEnumerable<Transaction>
Sammlung inTransactionPagedResult
.
Ich habe meinen eigenen JsonConverter erstellt, den ich als Eigenschaft zum hinzugefügt habeIEnumerable<Transaction>
mit dem[JsonConverter(typeof(TransactionCreationConverter))]
Attribut, aber das hat nicht funktioniert, ich bekomme den folgenden Fehler:
Zusätzliche Informationen: Fehler beim Lesen von JObject aus JsonReader. Das aktuelle JsonReader-Objekt ist kein Objekt: StartArray. Pfad 'Transaktionen', Zeile 1, Position 218.
Ich verstehe das, weil JSON.NET versucht, die gesamte Sammlung zu deserialisieren, aber ich möchte, dass jedes Objekt in der Sammlung einzeln deserialisiert wird.
Jemand?