Member 14779968 Ответов: 0

Как исправить исключение runtime binder при попытке получить тип свойства json?


//Вот Json-файл
{
    "groups": null,
    "data": [{
            "type": 123,
            "name": "Name123"
        },
        {
            "type": 567,
            "name": "SecondName"

        }
    ],
    "total": 2

}




// Я потом мой десериализации JSON в любой словарь или список.. в этом случае это будет список ... а затем я использую цикл foreach, чтобы сначала получить тип..
результат[t].GetType() дает мне исключение

var result = Helpers.JsonHelper.DeserializeToDictionaryOrList(jsonString);

    foreach (var t in result.Keys)
                    {
                        var actualType = result[t].GetType();  

                    }



//Здесь метод DeserializeToDictionaryOrList для справки
public static class JsonHelper
   {
       public static dynamic DeserializeToDictionaryOrList(string jsonString, bool isArray = false)
       {
           if (!isArray)
               isArray = jsonString.Substring(0, 1) == "[";

           if (!isArray)
           {
               var responseJson = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);
               var copyOfResponseJson = new Dictionary<string, object>();
               foreach (KeyValuePair<string, object> myDictionary in responseJson)
               {
                   if (myDictionary.Value is JObject)
                       copyOfResponseJson.Add(myDictionary.Key, DeserializeToDictionaryOrList(myDictionary.Value.ToString()));
                   else if (myDictionary.Value is JArray)
                       copyOfResponseJson.Add(myDictionary.Key, DeserializeToDictionaryOrList(myDictionary.Value.ToString(), true));
                   else
                       copyOfResponseJson.Add(myDictionary.Key, myDictionary.Value);
               }
               return copyOfResponseJson;
           }
           else
           {
               var responseJson = JsonConvert.DeserializeObject<List<object>>(jsonString);
               var copyOfResponseJson = new List<object>();
               foreach (var myDictionary in responseJson)
               {
                   if (myDictionary is JObject)
                       copyOfResponseJson.Add(DeserializeToDictionaryOrList(myDictionary.ToString()));
                   else if (myDictionary is JArray)
                       copyOfResponseJson.Add(DeserializeToDictionaryOrList(myDictionary.ToString(), true));
                   else
                       copyOfResponseJson.Add(myDictionary);
               }
               return copyOfResponseJson;
           }
       }


Что я уже пробовал:

Я не знаю, почему это вызывает исключение.. это было просто прекрасно с другим Json.. Я предполагаю, потому что в первый раз результат[t] - это группы, а значение в json равно нулю.. Я не совсем уверен в этом..

Sandeep Mewara

Когда вы десериализуетесь, разве вы не должны сказать, какого типа он должен быть? Учитывая, что это может происходить в вашем методе DeserializeToDictionaryOrList, каков здесь тип результата?
Я считаю, что ошибка будет в цикле foreach. Если да, то можете ли вы обновить вопрос информацией о помощниках метода?JsonHelper.DeserializeToDictionaryOrList

Member 14779968

Привет, Сандип, конечно. Я обновил вопрос и включил метод DeserializeToDictionaryOrList

Sandeep Mewara

Основываясь на типе, который вы ожидаете от "словаря", кажется, что вы можете ожидать его от "данных" в json. не весь json - есть ли причина, по которой конвертировать все как словарь?

Проверяли ли вы значение copyOfResponseJson во время отладки, чтобы увидеть, что оно содержит ожидаемые значения?

Member 14779968

Да, я так и сделал. Я получаю все ключи и значения в copyOfResponseJson. Я все понял..
[0] {[группы, null]}
[1] {[data, Count = 100]}
[2] {[итого, 110]}

Sandeep Mewara

Кстати, я не знаю намерения, если схема json известна, я бы десериализовался в класс, а затем использовал бы его объект для любого использования.

0 Ответов