我试图获取动态对象的属性值。将json字符串解析/反序列化为动态对象,然后我想按名称访问属性,后跟get值。
string json = "{\"key1\":\"value1\", \"key2\": \"value2\"}";
dynamic d = JObject.Parse(json);
Console.WriteLine("Key1 : " + d.key1); //value1
上面的代码按预期工作,但如何使用存储在变量中的名称获取属性来获取值?
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 :(得分:2)
是否必须使用Reflection?您知道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 :(得分: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");