Cuando seria datos arbitrarios a través de JSON.NET, cualquier propiedad que es nulo se escribe en el JSON comode números de serie nula en JSON.NET
"nombrePropiedad": null
Esto es correcto, por supuesto.
Sin embargo, tengo la obligación de traducir automáticamente todos los nulos al valor vacío predeterminado, p. nulo string
s debe convertirse en String.Empty
, nulo int?
s debe convertirse en 0
, nulo bool?
s debe ser false
, y así sucesivamente.
NullValueHandling
no es muy útil, ya que no quiero Ignore
nulos, pero tampoco quiero Include
ellos (Hmm, nueva característica?).
Así que recurrí a la implementación de un JsonConverter
personalizado.
Si bien la implementación en sí misma fue muy sencilla, desafortunadamente esto aún no funcionó: CanConvert()
nunca se invoca para una propiedad que tiene un valor nulo y, por lo tanto, tampoco se llama a WriteJson()
. Aparentemente, los valores nulos se serializan automáticamente directamente en null
, sin la interconexión personalizada.
Por ejemplo, aquí es una muestra de un convertidor de medida para cadenas nulas:
public class StringConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(string).IsAssignableFrom(objectType);
}
...
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
string strValue = value as string;
if (strValue == null)
{
writer.WriteValue(String.Empty);
}
else
{
writer.WriteValue(strValue);
}
}
}
Pasando a través de este en el depurador, he observado que ninguno de estos métodos son llamados para las propiedades que tienen un valor nulo.
Al profundizar en el código fuente de JSON.NET, descubrí que (al parecer, no profundicé mucho) hay un caso especial que comprueba si hay nulos y se llama explícitamente al .WriteNull()
.
Por lo que vale la pena, Yo probé la implementación de una costumbre JsonTextWriter
y anulando la implementación predeterminada .WriteNull()
...
public class NullJsonWriter : JsonTextWriter
{
...
public override void WriteNull()
{
this.WriteValue(String.Empty);
}
}
Sin embargo, esto no puede funcionar bien, ya que el método WriteNull()
no sabe nada sobre el subyacente tipo de datos. Así que estoy seguro, puedo sacar ""
para cualquier nulo, pero eso no funciona bien para, p. int, bool, etc.
Por lo tanto, mi pregunta es que, a menos que se convierta manualmente toda la estructura de datos, ¿hay alguna solución o solución para esto?
Supongo que el método 'WriteNull()' se llama internamente en el proceso de serialización JSON y no puede determinar qué valor está serializando actualmente? –
JsonSerializer llama al método WriteNull cuando la propiedad tiene un valor nulo. Para ser preciso, el valor que estoy serializando siempre es nulo :), pero sí, parece que no hay forma de conocer el tipo de datos subyacente para el que se escribe el nulo. – AviD
¿De qué sirve usar tipos que aceptan nulos si va a ignorar nulo como un estado válido del objeto? –