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 einemrecipientund 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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage