Как исправить исключение 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 известна, я бы десериализовался в класс, а затем использовал бы его объект для любого использования.