Newtonsoft PopulateObject - значение не может быть нулевым исключением

Два операнда (1 и 3) являются целыми числами, поэтому используется целочисленная арифметика (деление здесь). Объявление переменной результата как double просто приводит к возникновению неявного преобразования после деления .

Целочисленное разделение конечно возвращает истинный результат деления, округленный до нуля. Таким образом, результат 0.333... округляется до 0. (Обратите внимание, что процессор фактически не делает никакого округления, но вы можете думать об этом так же).

Также обратите внимание, что если указаны оба операнда (числа) как плавающие; 3.0 и 1.0, или даже только first , то используется арифметика с плавающей запятой, дающая вам 0.333....

1
задан dbc 15 January 2019 в 23:29
поделиться

1 ответ

Ваша основная проблема в том, что вы объявили ErrorDTO как IEnumerator, IEnumerable, то есть нетипизированный, неуниверсальный перечислимый тип. Json.NET интерпретирует такой объект как нетипизированную только для чтения коллекцию , поэтому при попытке ее заполнения вы получите исключение:

System.ArgumentNullException: Value cannot be null.
   at System.RuntimeType.MakeGenericType(Type[] instantiation)
   at Newtonsoft.Json.Serialization.JsonArrayContract.CreateWrapper(Object list)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Populate(JsonReader reader, Object target)
   at Newtonsoft.Json.JsonSerializer.PopulateInternal(JsonReader reader, Object target)
   at Newtonsoft.Json.JsonConvert.PopulateObject(String value, Object target, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.PopulateObject(String value, Object target)

Сообщение об исключении не является полезный и вводящий в заблуждение, но настоящая причина в том, что Json.NET не имеет возможности узнать ни целевой тип элементов коллекции, к которым следует десериализоваться, ни метод добавления их после десериализации для любой нетипизированной коллекции только для чтения.

Обычным способом решения такой проблемы было бы объявить ErrorDTO как ICollection<ErrorObj> и реализовать необходимые обобщенные методы, информируя тем самым Json.NET как о типе элемента, так и о [116 ] , но, к сожалению, вы утверждаете

Я не могу изменить их [классы].

Таким образом, самым простым обходным решением было бы заполнение базового списка:

Newtonsoft.Json.JsonConvert.PopulateObject(json, resultDTO.ErrorList);

Демо-скрипка здесь .

0
ответ дан dbc 15 January 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: