Запретить NewtonSoft Json добавлять конечный 0 [дубликат]

Dec 01 2020

Я столкнулся с неожиданной проблемой с NewtonSoft.Jsonбиблиотекой. Похоже, он добавляет конечный 0 к десятичным значениям, не имеющим десятичной части:

JsonConvert.SerializeObject(1m)

Вернется следующую строку: "1.0".

Хотя во многих случаях это не проблема, в моем случае меня действительно волнует точность, которую обеспечивают пользователи. Если пользователь входит 1, мне нужно сохранить 1в моей базе данных. Если он обеспечивает, 1.0то мне нужно хранить 1.0.

Я использую последнюю версию библиотеки:, 12.0.3но я пробовал использовать все предыдущие основные версии, вплоть до 9.0.1, и все они дают одинаковый результат.

Я видел несколько вопросов о том, что библиотека удаляет конечный 0 (сообщается как ошибка, исправленная в версии 11.X), но ни одного вопроса о добавлении.

Это ошибка, о которой я должен сообщить? Как я могу изменить это поведение по умолчанию?

Ответы

1 DavidG Dec 01 2020 at 15:55

Это не ошибка, а принцип работы библиотеки. Если вы хотите переопределить это поведение, вам понадобится преобразователь настраиваемого типа, например:

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());
    }
}

А теперь сериализуйте так:

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

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