加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 00:11:18 所属栏目:百科 来源:网络整理
导读:我在 JSON反序列化后访问动态属性时遇到了一些问题.这是JSON: { "user" : { "511221" :{ "timestamp" : 1403365646384,"version" : -81317051,"email" : "user@name.com","name" : "My Name","structures" : [ "structure.62dd1ff1-f96b-22e3-8d4e-22000c20
我在 JSON反序列化后访问动态属性时遇到了一些问题.这是JSON:

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

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

而且,这是一个数字. 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而不是动态,然后您可以动态地按属性名称访问该属性,例如:

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读