Requisito.
Para serialização json com json.net
:
- Converta valores double inválidos
double.NaN
(por exemplo ) paranull
. - Faça o dobro mais curto (G3).
- Não escreva propriedades com
null
valores.
Parece simples?
A solução óbvia.
O primeiro e o segundo são feitos criando um conversor json, certo?
O terceiro é feito usando JsonSerializerSettings
with NullValueHandling = NullValueHandling.Ignore
, correto?
Bem, há um problema, eles não funcionam juntos. Se o valor for null
, então o conversor nem é chamado, ótimo. Mas se o conversor produz null
, o null-value-ignoring não acontece.
Tentar.
Abaixo está o código ou tente reproduzir diretamente. O que devo fazer?
static void Main(string[] args)
{
var test = new A(
d: 1.23456789,
nd1: 1.23456789,
nd2: null,
nd3: double.NaN,
da: [1.23456789],
nda: [1.23456789, null, double.NaN]);
var json = JsonConvert.SerializeObject(test, new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
Converters = { new MyJsonConverter() }
});
Console.WriteLine(json);
}
public class MyJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType) => objectType == typeof(double) || objectType == typeof(double?);
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
if (value is double input && double.IsFinite(input))
writer.WriteRawValue(input.ToString("G3", NumberFormatInfo.InvariantInfo));
else
writer.WriteNull();
}
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) => throw new NotImplementedException();
}
public record A(
double d,
double? nd1,
double? nd2,
double? nd3,
double[] da,
double?[] nda)
{ }
Saída:
{"d":1.23,"nd1":1.23,"nd3":null,"da":[1.23],"nda":[1.23,null,null]}
A saída esperada é sem nd3
:
{"d":1.23,"nd1":1.23,"da":[1.23],"nda":[1.23,nulo,nulo]}
PS: Não consegui pensar em um bom título, então perguntando como resolver minha tentativa de solução (problema XY). Acho que esse título descreve melhor a intenção e alguém pode enfrentar um problema semelhante, onde o valor produzido pelo conversor deve influenciar a propriedade json.