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

本文关键字:访问 属性 反序列化 动态 JSON | 更新日期: 2023-09-27 18:09:55

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

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

这里实际上有两个问题。首先,每个用户的"511221"都会发生变化。这是在身份验证时给出的。我不能创建一个用户类,然后创建另一个类的名称不断变化。

也是一个数字。我敢说,没有办法将类名作为数字。我有什么选择?我不能控制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()为空。我知道属性"user"存在,但为什么我不能访问它?

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

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

JObject jObject = JsonConvert.DeserializeObject<JObject>(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);