Можете ли вы определить, был ли объект, десериализованный объект, отсутствием поля с 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 (например, C #)?
  • GSON десериализует значение ключа для пользовательского объекта
  • Как вы сериализуете объект на C ++?
  • Добавление к ObjectOutputStream
  • Задача не сериализуема: java.io.NotSerializableException при вызове функции закрытие только для classов не объектов
  • jackson не десериализует общий список, который он сериализовал
  • Сериализация с Qt
  • Может ли Json.NET сериализовать / десериализовать в / из streamа?
  • ShouldSerialize * () vs * Условный шаблон условной сериализации
  • Рекомендации по сериализации объектов в пользовательский строковый формат для использования в выходном файле
  • C # десериализация структуры после ее получения через TCP
  • Давайте будем гением компьютера.