Kiedy szeregowania dowolnych danych poprzez Json.NET, jakiegokolwiek mienia, które jest NULL są zapisywane w formacie JSON jakoSzeregowania wartości null w Json.NET
"propertyName": null
To jest prawidłowe, oczywiście.
Mam jednak wymóg automatycznego tłumaczenia wszystkich wartości null na domyślną pustą wartość, np. null string
s powinno stać się String.Empty
, null int?
s powinno stać się 0
, null bool?
s powinno być false
, i tak dalej.
NullValueHandling
nie jest pomocne, ponieważ nie chcę Ignore
wartości null, ale nie chcę też Include
je (Hmm, nowa funkcja?).
Więc zwróciłem się do realizacji niestandardowego JsonConverter
.
Chociaż sama implementacja była prosta, niestety to nadal nie działało - CanConvert()
nigdy nie jest wywoływana dla właściwości, która ma wartość pustą, a zatem WriteJson()
również nie jest wywoływana. Najwyraźniej wartości null są automatycznie szeregowane bezpośrednio do null
, bez niestandardowego potoku.
Na przykład, oto próbka niestandardowych konwerter zerowych strun:
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);
}
}
}
Krocząc przez to w debugera, ja zauważyć, że żadna z tych metod są powołani do właściwości, które mają wartość null.
Po przejściu do kodu źródłowego JSON.NET odkryłem, że (najwyraźniej nie wdałem się w głębię) istnieje specjalny przypadek sprawdzania wartości zerowych i jednoznacznie nazywa się .WriteNull()
.
Na co warto, Próbowałem realizacji niestandardowych JsonTextWriter
i przesłanianie domyślna implementacja .WriteNull()
...
public class NullJsonWriter : JsonTextWriter
{
...
public override void WriteNull()
{
this.WriteValue(String.Empty);
}
}
Jednak to nie może działać dobrze, ponieważ metoda WriteNull()
wie nic na temat instrumentu bazowego typ danych. Tak więc, mogę wypisać ""
dla dowolnej wartości null, ale to nie działa dobrze na przykład int, bool, itp.
Tak, moje pytanie - brak konwersji całej struktury danych ręcznie, czy istnieje jakieś rozwiązanie lub obejście tego?
Zgaduję, że metoda 'WriteNull()' jest wywoływana wewnętrznie w procesie serializacji JSON i nie możesz określić, którą wartość serializujesz? –
Metoda WriteNull jest wywoływana przez JsonSerializer, gdy właściwość ma wartość pustą. Aby być dokładnym, wartość, którą serializuję, jest zawsze zerowa :), ale tak, wydaje się, że nie ma możliwości poznania podstawowego typu danych, dla którego zapisywana jest wartość pusta. – AviD
Jaki jest sens używania typów zerowujących, jeśli po prostu zignorujesz wartość null jako prawidłowy stan obiektu? –