2016-04-12 12 views
4

Ich rufe einen REST-Endpunkt von C# und ich empfange JSON, die in ein Objekt serialisiert wird. Eine der Eigenschaften dieses Objekts ist eine dynamische Eigenschaft. Der Wert der dynamischen Eigenschaft als anonymes Objekt auf dem Server Seite wie diese gesetzt:Konvertieren von JObject in ein dynamisches Objekt

myObject.MyDynamicProp = new { Id = "MyId2134", Name = "MyName" }; 

Auf der Client-Seite des Wert der dynamischen Eigenschaft von der Json Serialisierung ist ein JObject den folgenden Wert enthält:

{{ 
    "id": "MyId2134", 
    "Name": "MyName" 
}} 

ich hätte anknüpfen können diese die Eigenschaften wie zuzugreifen:

var s = myObject.MyDynamicProp.Name; 

aber ich va bekommen muss nicht die Eigenschaft Name finden statt lue wie folgt aus:

var s = myObject.MyDynamicProp["Name"].Value; 

Ich versuchte, das JObject zu einem dynamischen Objekt wie diese Umwandlung, aber es gibt JObject:

var dyn = myObject.MyDynamicProp.ToObject<dynamic>(); 

Wie kann ich die dynamische Eigenschaft Wert zu konvertieren, so dass ich seine Eigenschaften nennen kann direkt ?

var s = myObject.MyDynamicProp.Name; 

UPDATE ...

lief ich die folgende

dynamic d = JsonConvert.DeserializeObject("{\"MyDynamicProp\": {\"id\": \"MyId2134\", \"Name\": \"MyName\"}}"); 
string name = d.MyDynamicProp.Name; 

die mir die folgenden den Fehler gibt:

{Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: `Newtonsoft.Json.Linq.JObject' does not contain a definition for `MyDynamicProp' 
    at Microsoft.Scripting.Interpreter.ThrowInstruction.Run (Microsoft.Scripting.Interpreter.InterpretedFrame frame) [0x00027] 

Ich möchte hinzufügen, dass dies eine ist Xamarin iOS-Projekt und der Code befindet sich in einer PCL-Bibliothek.

Antwort

13

Es ist eigentlich ziemlich einfach. Anstelle der Verwendung von var Verwendung dynamic auf Ihrem JObject und Sie werden in Ordnung sein:

dynamic do = myObject.MyDynamicProp; 

string name = do.Name; 

Von Ihrem Fragment:

dynamic d = JsonConvert.DeserializeObject("{\"MyDynamicProp\": {\"id\": \"MyId2134\", \"Name\": \"MyName\"}}"); 
string name = d.MyDynamicProp.Name; 

Console.WriteLine(name); // writes MyName 

Warum dies funktioniert: Wie Richard erklärt, leitet JObject indirekt aus JToken die IDynamicMetaObjectProvider implementiert. Es ist diese Schnittstelle, die dynamic ermöglicht zu arbeiten.

+4

Warum dies funktioniert: 'JObject' leitet indirekt von' JToken' die Arbeitsgeräte [ 'IDynamicMetaObjectProvider'] (https://msdn.microsoft.com/en-us/library/System.Dynamic.IDynamicMetaObjectProvider.aspx) . Es ist diese Schnittstelle, die 'dynamic' erlaubt zu arbeiten. – Richard

+0

Ja, tatsächlich. Danke, Richard. Kann ich das an meine Antwort anhängen? –

+0

Fühlen Sie sich frei, dies zu tun. – Richard

Verwandte Themen