Можете ли вы определить, был ли объект, десериализованный объект, отсутствием поля с classом JsonConvert в Json.NET

Я пытаюсь десериализовать некоторые объекты Json с помощью Json.NET. Однако я обнаружил, что когда я десериализую объект, у которого нет свойств, которые я ищу, нет ошибки, но значение свойства по умолчанию возвращается для свойств при доступе к ним. Очень важно, что я могу определить, когда я десериализую неправильный тип объекта. Пример кода:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; namespace Json_Fail_Test { class Program { [JsonObject(MemberSerialization.OptOut)] private class MyJsonObjView { [JsonProperty("MyJsonInt")] public int MyJsonInt { get; set; } } const string correctData = @" { 'MyJsonInt': 42 }"; const string wrongData = @" { 'SomeOtherProperty': 'fbe8c20b' }"; static void Main(string[] args) { var goodObj = JsonConvert.DeserializeObject(correctData); System.Console.Out.WriteLine(goodObj.MyJsonInt.ToString()); var badObj = JsonConvert.DeserializeObject(wrongData); System.Console.Out.WriteLine(badObj.MyJsonInt.ToString()); } } } 

Результат этой программы: 42 0

Я бы предпочел, чтобы исключение было брошено в молчание. Коротко, есть ли способ определить, не удалось ли сериализации найти параметр?

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

Сериализатор Json.Net имеет параметр MissingMemberHandling который вы можете установить на « Error . (По умолчанию – Ignore .) Это приведет к тому, что сериализатор будет генерировать JsonSerializationException во время десериализации всякий раз, когда он встречает свойство JSON, для которого нет соответствующего свойства в целевом classе.

 static void Main(string[] args) { try { JsonSerializerSettings settings = new JsonSerializerSettings(); settings.MissingMemberHandling = MissingMemberHandling.Error; var goodObj = JsonConvert.DeserializeObject(correctData, settings); System.Console.Out.WriteLine(goodObj.MyJsonInt.ToString()); var badObj = JsonConvert.DeserializeObject(wrongData, settings); System.Console.Out.WriteLine(badObj.MyJsonInt.ToString()); } catch (Exception ex) { Console.WriteLine(ex.GetType().Name + ": " + ex.Message); } } 

Результат:

 42 JsonSerializationException: Could not find member 'SomeOtherProperty' on object of type 'MyJsonObjView'. Path 'SomeOtherProperty', line 3, position 33. 

Просто добавьте [JsonProperty(Required = Required.Always)] к требуемым свойствам, и он будет генерировать исключение, если свойство не существует при десериализации.

 [JsonProperty(Required = Required.Always)] public int MyJsonInt { get; set; } 

Поместите следующие атрибуты на требуемые свойства:

 [DataMember(IsRequired = true)] 

Если член отсутствует, он выкинет исключение Newtonsoft.Json.JsonSerializationException.

Как предложил Брайан ниже, вам также понадобится этот атрибут для вашего classа:

 [DataContract] 

Просто определите своих членов в classе определения с вопросительным знаком «?» int? :

 private class MyJsonObjView { [JsonProperty("MyJsonInt")] public int? MyJsonInt { get; set; } } 

Если он не инициализирован, он будет равен null , иначе это будет действительное значение. Это позволяет вам иметь дополнительные настройки и оценивать их по умолчанию.

  • Есть ли у .NET 4 встроенный сериализатор / десериализатор JSON?
  • Как изменить имена свойств при сериализации с помощью Json.net?
  • Как десериализовать объект JObject для .NET
  • Сериализация типа Json.Net с полиморфным дочерним объектом
  • Как можно полиморфная десериализация Json String с использованием Java и библиотеки Jackson?
  • Преобразование записей в последовательную форму данных для отправки по HTTP
  • Как десериализовать JSON с двойными именами свойств в одном и том же объекте
  • Сериализовать компоненты JavaFX
  • Deserialize JSON в динамический объект C #?
  • jQuery serializeArray не включает кнопку отправки, которая была нажата
  • Уничтожить stream массива json по одному элементу за раз
  • Interesting Posts

    Нужна помощь в разработке логики БД

    Запрос ODBC не может быть выполнен, потому что он слишком сложный?

    Создайте ведро в Amazon S3

    Возможно ли писать файлы Ysams / Ansible hosts / inventory?

    как экспортировать (JUnit) набор тестов как исполняемый банку

    Найти текущую медиану из streamа целых чисел

    Как определить k при использовании кластеризации k-mean?

    Android маршрутизирует маршрут по карте с двумя POI-s

    Спящий режим, настраивающий несколько источников данных и несколько сессионных заводов

    В Scala есть оператор присваивания «=» вызов метода?

    Могут ли на жесткий диск (ноутбук) воздействовать магниты, например, наушники или сотовый телефон?

    Что означает точка в R – личное предпочтение, соглашение об именовании или более?

    Как ускорить получение Powershell Get-Childitem над UNC

    Ошибка загрузки Windows: C: \ Windows \ system32 \ config \ system Код ошибки: 0xc0000185

    Поиск всех уникальных перестановок строки без генерации дубликатов

    Давайте будем гением компьютера.