Quando serializzazione dati arbitrari via JSON.NET, qualsiasi proprietà che è null viene scritto il JSON comeserializzazione null in JSON.NET
"propertyName": null
Ciò è corretto, ovviamente.
Tuttavia, ho il requisito di tradurre automaticamente tutti i valori null nel valore vuoto predefinito, ad es. null string
s dovrebbe diventare String.Empty
, null int?
s dovrebbe diventare 0
, null bool?
s deve essere false
e così via.
NullValueHandling
non è utile, dal momento che non desidero annullare i valori di Ignore
, ma nemmeno io voglio Include
(Hmm, nuova funzione?).
Così ho deciso di implementare una custom JsonConverter
.
Mentre l'implementazione stessa era un gioco da ragazzi, sfortunatamente questo non funzionava ancora - CanConvert()
non viene mai chiamato per una proprietà che ha un valore nullo, e quindi non viene chiamato neanche WriteJson()
. Apparentemente i valori nulli vengono automaticamente serializzati direttamente in null
, senza la pipeline personalizzata.
Ad esempio, qui è un esempio di un convertitore personalizzato per stringhe null:
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);
}
}
}
Entrando attraverso questo nel debugger, ho notato che nessuno di questi metodi sono chiamati oggetti che hanno un valore nullo.
Scavando nel codice sorgente di JSON.NET, ho scoperto che (a quanto pare, non sono entrato in profondità) c'è un caso speciale che verifica i valori nulli e chiama esplicitamente .WriteNull()
.
Per quello che vale, ho provato l'attuazione di un personalizzato JsonTextWriter
e ignorando l'implementazione predefinita .WriteNull()
...
public class NullJsonWriter : JsonTextWriter
{
...
public override void WriteNull()
{
this.WriteValue(String.Empty);
}
}
Tuttavia, questo non può funzionare bene, in quanto il metodo WriteNull()
non sa nulla del sottostante tipo di dati. Così sicuro, posso produrre ""
per qualsiasi null, ma che non funziona bene per es. int, bool, ecc.
Quindi, la mia domanda, a meno di convertire manualmente l'intera struttura dati, può esserci qualche soluzione o soluzione?
Sto indovinando che il metodo 'WriteNull()' è chiamato internamente all'interno del processo di serializzazione JSON e non è possibile determinare quale valore si sta attualmente serializzando? –
Il metodo WriteNull viene chiamato da JsonSerializer quando la proprietà ha un valore nullo. Per essere precisi, il valore che sto serializzando è sempre nullo :), ma sì sembra che non ci sia modo di conoscere il tipo di dati sottostante per il quale il null viene scritto. – AviD
Qual è il punto di utilizzo dei tipi nullable se si intende ignorare null come stato valido dell'oggetto? –