2

I am a newbie in Jil.JSON. I am using 'JSON.DeserializeDynamic' because the 'JSON' string always varies for different customer's requirements.

In my code, I am using 'foreach'. 'keyValue' is a dynamic with 'Key' and 'Value' properties.

I am trying to get the values of 'keyValue.Value Type' and 'keyValue.Value StringValue' but I do not know how to get these Non-Public members' values.

need to get the Type and StringValue

enter image description here

Here a sample of my code:

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

I tried using 'keyValue.GetType()' but it is giving me a different properties.

enter image description here

Edited:

I am almost there....

            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

now, i need to get the 'member value'

any ideas?

4

1 回答 1

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
于 2019-10-16T06:48:45.780 回答