Как получить непубличные члены из динамического объекта, созданного Jil.JSON.DeserializeDynamic? - PullRequest
1 голос
/ 15 октября 2019

Я новичок в Jil.JSON. Я использую «JSON.DeserializeDynamic», потому что строка «JSON» всегда варьируется в зависимости от требований клиента.

В моем коде я использую «foreach». «keyValue» - это динамическое свойство со свойствами «Key» и «Value».

Я пытаюсь получить значения «keyValue.Value Type» и «keyValue.Value StringValue», но не знаю, как это сделать. получить значения этих непубличных членов.

необходимо получить Type и StringValue

enter image description here

Вот пример моего кода:

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 (), но он дает мне другие свойства.

enter image description here

Отредактировано:

Я почти на месте ....

            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

Теперь мне нужно получить 'значение члена'

Есть идеи?

1 Ответ

1 голос
/ 16 октября 2019

... не очень хороший код, но сейчас он работает.

...
           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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...