2016-07-22 75 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"); 
相關問題