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