¿Puedes detectar si un objeto que deserializaste faltaba un campo con la clase JsonConvert en Json.NET?

Estoy tratando de deserializar algunos objetos Json utilizando Json.NET. Sin embargo, he encontrado que cuando deserializo un objeto que no tiene las propiedades que estoy buscando, no se genera ningún error, pero se devuelve un valor predeterminado para las propiedades cuando accedo a ellas. Es importante que pueda detectar cuando he deserializado el tipo de objeto incorrecto. Código de ejemplo:

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()); } } } 

El resultado de este progtwig es: 42 0

Preferiría que se arrojara una excepción a fallar silenciosamente. A falta de eso, ¿hay alguna forma de detectar si la serialización no pudo encontrar un parámetro?

Sé que puedo analizar los datos con un objeto Json y luego verificar el parámetro con una búsqueda de valor de clave, pero la base de código en la que estoy utiliza el patrón anterior y me gustaría mantenerlo constante si es posible.

El serializador Json.Net tiene una configuración MissingMemberHandling que puede establecer en Error . (El valor predeterminado es Ignore ). Esto causará que el serializador JsonSerializationException una JsonSerializationException durante la deserialización siempre que encuentre una propiedad JSON para la que no haya una propiedad correspondiente en la clase objective.

 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); } } 

Resultado:

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

Simplemente agregue [JsonProperty(Required = Required.Always)] a las propiedades requeridas y arrojará una excepción si la propiedad no está allí mientras se deserializa.

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

Coloque el siguiente atributo en las propiedades requeridas:

 [DataMember(IsRequired = true)] 

Si el miembro no está presente, arrojará una Newtonsoft.Json.JsonSerializationException.

Como Brian sugirió a continuación, también necesitarás este atributo en tu clase:

 [DataContract] 

Simplemente defina a sus miembros en su clase de definición con un signo de interrogación ‘?’ int? :

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

Cuando no se inicializa, será null , de lo contrario será un valor válido. Esto le permite tener configuraciones opcionales y evaluarlas por configuración.