【问题标题】:How do I get Non-Public members from a dynamic object created by Jil.JSON.DeserializeDynamic?如何从 Jil.JSON.DeserializeDynamic 创建的动态对象中获取非公共成员?
【发布时间】:2019-10-16 14:48:45
【问题描述】:

我是 Jil.JSON 的新手。 我正在使用“JSON.DeserializeDynamic”,因为“JSON”字符串总是因不同客户的要求而异。

在我的代码中,我使用的是“foreach”。 'keyValue' 是具有 'Key' 和 'Value' 属性的动态。

我正在尝试获取 'keyValue.Value Type' 和 'keyValue.Value StringValue' 的值,但我不知道如何获取这些非公共成员的值。

需要获取Type和StringValue

这是我的代码示例:

string json = "{\"Items\":[{ \"Name\":\"Ballpen\", \"Price\":12.3 },{ \"Name\":\"Pencil\", \"Price\":3.21 }],\"Date\":\"21112019\"}";

using (var str = new StringReader(json ))
   {
       foreach (var keyValue in JSON.DeserializeDynamic(@str, Jil.Options.IncludeInherited))
       {
           //check the keyValue.Value Type  
           //if keyValue.Value Type is string, get the StringValue     
       };
}

我尝试使用 'keyValue.GetType()' 但它给了我不同的属性。

已编辑:

我快到了……

            json = "{\"Items\":[{ \"Name\":\"Ballpen\", \"Price\":12.3 },{ \"Name\":\"Pencil\", \"Price\":3.21 }],\"Date\":\"21112019\"}";
            Dictionary<string, object> la = JSON.Deserialize<Dictionary<string, object>>(json);

            foreach (var data in la)
            {
                Console.WriteLine("Key=" + data.Key);
                Console.WriteLine("Value=" + data.Value.ToString());

                Type t = data.Value.GetType();
                MemberInfo[] members = t.GetMembers(BindingFlags.NonPublic |
                BindingFlags.Instance);
                foreach (MemberInfo member in members)
                {                    
                    if(member.Name == "Type")
                    {
                        Console.WriteLine(member.Name);
                        //member.MemberType.GetType();

                    }
                    if (member.Name == "StringValue")
                    {
                        Console.WriteLine(member.Name);                      
                    }
                }

            }


Key=Items
Value=[{
 "Name": "Ballpen",
 "Price": 12.3
}, {
 "Name": "Pencil",
 "Price": 3.21
}]
Type
StringValue
Key=Date
Value="21112019"
Type
StringValue

现在,我需要获取“会员价值”

有什么想法吗?

【问题讨论】:

  • 有什么问题? Items 一个数组。您必须遍历其内容才能访问各个项目。即使使用dynamic,您仍然必须通过索引访问数组成员,例如必须写入dynamic someObject=JSON.DeserializeDynamic(..); var firstName=someObject.Items[0].Name;foreach(dynamic item in someObject.Items){ var name=item.Name;}
  • 你绝对是对的......我的情况是如何获得“非公共成员”的价值...... keyValue.Value.Type keyValue.Value StringValue 但是,这些不起作用
  • ![error] (ibb.co/7RGBPZw) 我尝试使用 keyValue.Value.Type 我收到错误
  • 如果您想访问原始值,为什么不反序列化为 Dictionary&lt;string,object&gt; ?或者使用 JSON.NET - 您不是在 反序列化 JSON 字符串,而是在尝试访问单个值。这就是两个库提供的原始 JSON 对象的工作
  • ![使用 Dictionary] (ibb.co/zXH9yZg) 我尝试使用
    Dictionary
     但仍然......我无法访问“Type”和“StringValue”属性。 ..我做错了吗?

标签: c# jil


【解决方案1】:

...不是一个好的代码,但现在它可以工作了。

...
           json = "{\"Items\":[{ \"Name\":\"Ballpen\", \"Price\":12.3 },{ \"Name\":\"Pencil\", \"Price\":3.21 }],\"Date\":\"21112019\"}";
            Dictionary<string, object> la = JSON.Deserialize<Dictionary<string, object>>(json);

            foreach (var data in la)
            {
                Console.WriteLine("Key=" + data.Key);
                Console.WriteLine("Value=" + data.Value.ToString());

                Type t = data.Value.GetType();
                MemberInfo[] members = t.GetMembers(BindingFlags.NonPublic |
                BindingFlags.Instance);
                String sType = "";
                foreach (MemberInfo member in members)
                {
                    Object oValue;
                    if(member.Name == "Type")
                    {

                        oValue = GetValue(member, data.Value);
                        sType = oValue.ToString();
                        Console.WriteLine(member.Name + "=" + oValue);
                        //member.MemberType.GetType();                    

                    }
                    if (member.Name == "StringValue")
                    {   
                        if(sType == "String")
                        {
                            oValue = GetValue(member, data.Value);
                            Console.WriteLine(member.Name + "=" + oValue);
                        }

                    }
                }
                Console.WriteLine();
                Console.WriteLine();
            }
...

我需要向下转换到 FieldInfo 或 PropertyInfo 以获取成员的值

        private object GetValue(MemberInfo memberInfo, object obj)
        {
            switch (memberInfo)
            {
                case FieldInfo fieldInfo:
                    return fieldInfo.GetValue(obj);
                case PropertyInfo propertyInfo:
                    return propertyInfo.GetValue(obj);
                default:
                    throw new InvalidOperationException();
            }
        }

Key=Items
Value=[{
 "Name": "Ballpen",
 "Price": 12.3
}, {
 "Name": "Pencil",
 "Price": 3.21
}]
Type=Array


Key=Date
Value="21112019"
Type=String
StringValue=21112019

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2019-03-09
    • 1970-01-01
    • 2015-09-03
    • 2021-04-22
    • 2012-12-18
    • 1970-01-01
    相关资源
    最近更新 更多