2016-07-22 5 views
0

動的オブジェクトのプロパティの値を取得しようとしています。 JSON文字列は解析され/動的化されたオブジェクトに逆シリアル化され、次にget値の後に名前でプロパティにアクセスしたい。C#でプロパティ名が変数にある動的型のプロパティ値を取得する方法

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

上記のコードは期待どおり機能しますが、変数に格納されている名前でgetプロパティを使用して値を取得する方法はありますか?

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)この問題に対する別の解決策がある場合は、例外Cannot perform runtime binding on a null reference

かをスローします。

+0

このアプローチに代わるものは、F#型プロバイダを使用するかもしれません(おそらくその上にAPIで別のアセンブリに詰め):

は反射せずに値を取得するには、いくつかの方法があります。 – BitTickler

答えて

2

それはリフレクションを使用する必要がありますか? JObject.ParseはJObjectを返すので、パブリックメソッド/プロパティが何であるかを知ることができます。 JSONのパブリックプロパティを公開していないことがわかります。したがって、値を取得できません。

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

と、このような:

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"); 
関連する問題