Impedir que NewtonSoft Json adicione 0 à direita [duplicado]

Dec 01 2020

Estou enfrentando um problema inesperado com a NewtonSoft.Jsonbiblioteca. Parece que adiciona um 0 à direita aos valores decimais que não têm uma parte decimal:

JsonConvert.SerializeObject(1m)

Irá retornar a seguinte cadeia: "1.0".

Embora não seja um problema em muitos casos, no meu caso, me preocupo com a precisão que os usuários estão fornecendo. Se um usuário entrar 1, preciso armazenar 1em meu banco de dados. Se ele fornecer, 1.0então eu preciso armazenar 1.0.

Estou usando a última versão da biblioteca:, 12.0.3mas tentei com todas as versões principais anteriores até 9.0.1, e todas produziram o mesmo resultado.

Tenho visto várias perguntas sobre a remoção da biblioteca de 0 à direita (relatado como um bug, corrigido na versão 11.X), mas nenhuma sobre a adição de um.

Este é um bug que devo relatar? Como posso substituir esse comportamento padrão?

Respostas

1 DavidG Dec 01 2020 at 15:55

Não é um bug, é como a biblioteca funciona. Se desejar substituir esse comportamento, você precisará de um conversor de tipo personalizado, por exemplo:

public class DecimalJsonConverter : JsonConverter<decimal>
{
    public override decimal ReadJson(JsonReader reader, Type objectType, 
        decimal existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, 
        decimal value, JsonSerializer serializer)
    {
        // Customise how you want the decimal value to be output in here
        // for example, you may want to consider culture
        writer.WriteRawValue(value.ToString());
    }
}

E agora serialize assim:

var settings = new JsonSerializerSettings
{
    Converters = new[] { new DecimalJsonConverter() }
};

var json = JsonConvert.SerializeObject(1m, settings);