JsonConvert.PopulateObject establece las propiedades int en 0 si no hay ningún valor.
Intenté poblar un objeto desde JSON con Newtonsoft.Json (v13) y algunas propiedades de este objeto no son requeridas. Espero que las propiedades no requeridas se mantengan como “null”, para que cuando las serialice nuevamente, sean ignoradas con [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] y no aparezcan en el resultado JSON. Pero cuando poblé mi objeto, las propiedades de tipo entero que no estaban presentes en mi JSON se establecieron en 0 por defecto en lugar de null como otros valores de tipo.
El contenido del archivo jsonData.txt:
{
“name”: “name”
}
El código de ejemplo:
public class MyClass
{
[JsonProperty(Required = Required.Always)]
public string name { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string prop1 { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public int prop2 { get; set; }
public Myclass(){}
}
string myClassJson = File.ReadAllText(“jsonData.txt”);
MyClass myClassObj = new MyClass();
JsonConvert.PopulateObject(myClassJson, myClassObj);
string jsonFromMyClassObjSerialized = JsonConvert.SerializeObject(myClassObj);
El resultado de jsonFromMyClassObjSerialized:
{
“name”: “name”,
“prop2”: 0
}
davy.ai
Para asegurarse de que las propiedades int se mantengan como null en lugar de 0 al poblar el objeto con Newtonsoft.Json, es necesario establecer el valor predeterminado de las propiedades int como null en la definición de la clase:
En el código anterior, agregamos los siguientes atributos a la propiedad
prop2
:[JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
– esto asegura que el valor predeterminado de esta propiedad se ignore y se llene con null en su lugar.[JsonConverter(typeof(NullIntConverter))]
– esto indica a Newtonsoft.Json que use un convertidor personalizado para convertir el valor null a int en lugar de utilizar la conversión predeterminada.[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
– esto indica a Newtonsoft.Json que ignore los valores null al serializar el objeto.A continuación, necesitamos definir el convertidor personalizado:
En el convertidor anterior, verificamos si el valor es null y devolvemos null si lo es. De lo contrario, convertimos el valor a int utilizando
Convert.ToInt32
.Con la definición de clase y el convertidor actualizados, el resultado de
jsonFromMyClassObjSerialized
ahora debería ser:Esto se debe a que la propiedad int
prop2
ahora es null y se ignora al serializar debido al atributoNullValueHandling = NullValueHandling.Ignore
.