2016-07-22 11 views
0

Ich versuche, den Wert einer Eigenschaft eines dynamischen Objekts abzurufen. Die JSON-Zeichenkette wird in ein dynamisches Objekt geparst/deserialisiert und dann möchte ich auf die Eigenschaft nach Namen zugreifen, gefolgt von dem get-Wert.So erhalten Sie den Eigenschaftswert eines dynamischen Typs, bei dem der Eigenschaftsname in einer Variablen in C# ist

string json = "{\"key1\":\"value1\", \"key2\": \"value2\"}"; 
dynamic d = JObject.Parse(json); 
Console.WriteLine("Key1 : " + d.key1); //value1 

Der obige Code funktioniert wie erwartet, aber wie erhält man den Wert mithilfe der Eigenschaft get nach Name, die in einer Variablen gespeichert ist?

string jsonKey = "key2"; 
string json = "{\"key1\":\"value1\", \"key2\": \"value2\"}"; 
dynamic d = JObject.Parse(json); 
var jsonValue = d.GetType().GetProperty(jsonKey).GetValue(d, null); //throws exception - Cannot perform runtime binding on a null reference 
Console.WriteLine("jsonValue : " + jsonValue); 

GetProperty(jsonKey) löst eine Ausnahme Cannot perform runtime binding on a null reference

Oder, wenn es eine alternative Lösung für dieses Problem ist.

+0

Eine Alternative zu diesem Ansatz könnte sein, F Anbieter # Typ (möglicherweise in eine separate Baugruppe mit einer API oben drauf gepackt) zu verwenden. – BitTickler

Antwort

2

Hat es Reflexion benutzen? Sie wissen, dass JObject.Parse JObject zurückgibt, damit Sie sehen können, was die öffentlichen Methoden/Eigenschaften sind. Sie können sehen, dass die öffentliche Eigenschaft von JSON nicht verfügbar ist. Daher können Sie den Wert nicht abrufen.

Es gibt mehrere Möglichkeiten, den Wert ohne Reflexion zu erhalten:

string jsonKey = "key2"; 
string json = "{\"key1\":\"value1\", \"key2\": \"value2\"}"; 
dynamic d = JObject.Parse(json); 
string jsonValue1 = d.Value<string>(jsonKey); // one way 
string jsonValue2 = (string)d[jsonKey]; // another way 
1

und wie folgt aus:

JsonValue jsonValue = JsonValue.Parse("{\"Width\": 800, \"Height\": 600, \"Title\": \"View from 15th Floor\", \"IDs\": [116, 943, 234, 38793]}"); 
    double width = jsonValue.GetObject().GetNamedNumber("Width"); 
    double height = jsonValue.GetObject().GetNamedNumber("Height"); 
    string title = jsonValue.GetObject().GetNamedString("Title"); 
    JsonArray ids = jsonValue.GetObject().GetNamedArray("IDs");