Frage

Ich verwende Json.Net, um JSON-Ergebnisse zu deserialisieren ExpandoObjects Verwenden von Code wie dem folgenden:

    var converter = new ExpandoObjectConverter();

    dynamic d = JsonConvert.DeserializeObject<ExpandoObject>(json, converter);

Dies funktioniert hervorragend für alles außer Antworten, die nur eine Liste im Stammverzeichnis des JSON-Schemas haben, wie zum Beispiel diese:

string json = @"[{""title"": ""the title""}]";

Im Darm von JsonConvert ist diese Methode:

public static T DeserializeObject<T>(string value, params JsonConverter[] converters)
{
    return (T)DeserializeObject(value, typeof(T), converters);
}

Der Rückgabewert DeserializeObject ist ein richtig konstruiertes List<object> mit auf ExpandoObject darin, aber der Code schlägt fehl, wenn er versucht, diese Liste in ein ExpandoObject selbst (den Wert von T) umzuwandeln.

Ich habe einen fehlgeschlagenen Komponententest und könnte das beheben, bin mir aber nicht sicher, wie ich einen ausfüllen soll List direkt in eine ExpandoObject.

Ist das möglich? DynamicObject hat TryGetIndex also gehe ich von einem aus ExpandoObject kann einen Indexer haben.Wäre es notwendig, sorgfältig eine listenartige Instanz von Expando zu erstellen, indem die Implementierung einer Indexierungsmethode dynamisch bereitgestellt wird, oder auf andere Weise eine Nicht-Expando-Instanz zu erstellen? DynamicObject die Liste halten und die korrekten Methoden aus dynamischen Methodenaufrufen aufrufen?

War es hilfreich?

Lösung

DynamicObject verfügt über TryGetIndex, daher gehe ich davon aus, dass ein ExpandoObject einen Indexer haben kann

Nein, das geht nicht.Probieren Sie es einfach aus, es gibt ein RuntimeBinderException:

Die Indizierung mit [] kann nicht auf einen Ausdruck vom Typ „System.Dynamic.ExpandoObject“ angewendet werden.

Ein ExpandoObject ist keine Liste;es ist eher wie ein Wörterbuch.

Wäre es notwendig, sorgfältig eine listenartige Instanz von expando zu erstellen, indem die Implementierung einer Indexierungsmethode dynamisch bereitgestellt wird, oder auf andere Weise ein nicht expandiertes dynamisches Objekt zu erstellen, um die Liste zu speichern und die korrekten Methoden aus dynamischen Methodenaufrufen aufzurufen?

Nun, Sie könnten eine benutzerdefinierte erstellen DynamicObject das verhält sich wie eine Liste, aber ich sehe darin keinen Nutzen:Sie können genauso gut eine normale Liste verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top