JSON反序列化后无法访问属性到动态

我在JSON反序列化后访问动态属性时遇到了一些问题。 这是JSON:

{ "user" : { "511221" :{ "timestamp" : 1403365646384, "version" : -81317051, "email" : "user@name.com", "name" : "My Name", "structures" : [ "structure.62dd1ff1-f96b-22e3-8d4e-22000c20725r" ] } }, } 

这里实际上有两个问题。 首先是每个用户的“511221”更改。 这是在validation时给出的。 我无法创建用户类,然后创建另一个名称不断更改的类。

而且,这是一个数字。 AFAIK,没有办法将类名作为数字。 我有什么选择? 我无法控制API返回的内容。

因此,我没有反序列化到预定义的类中,而是具有动态,如下所示:

 dynamic jsonObject = JsonConvert.DeserializeObject(response); 

我希望能够做到这一点:

 string[] structures = jsonObject.user.(authInfo.userid).structures; 

换句话说,我希望(authInfo.userid)将用户ID作为上面的字符串输入,但这似乎不可能。 我也试过反思:

 private static object ReflectOnPath(object o, string path) { object value = o; string[] pathComponents = path.Split('.'); foreach (var component in pathComponents) { Type type = value.GetType(); System.Reflection.PropertyInfo pi = type.GetProperty(component); //pi is null here, I have no idea why value = pi.GetValue(value); } return value; } 

所以它可以像这样调用,如上所示:

 string[] structures = ReflectOnPath(jsonObject, "user." + authInfo.userid + ".structures") as string[]; 

但是,当调用它时,类型(JObject)上的GetProperty()为null。 我知道属性“user”存在,但为什么我不能访问它?

您可以将JSON反序列化为JObject而不是dynamic ,然后您可以动态地按属性名称访问该属性,例如:

 JObject jObject = JsonConvert.DeserializeObject(response); var user = "511221"; var structures = jObject["user"][user]["structures"][0]; //given JSON input as in this question, //following line will print "structure.62dd1ff1-f96b-22e3-8d4e-22000c20725r" Console.WriteLine(structures);