NewtonSoft.Json
库出现意外问题。它似乎将尾部0添加到没有小数部分的十进制值中:
JsonConvert.SerializeObject(1m)
将返回以下字符串:"1.0"
。
虽然在很多情况下这不是一个问题,但就我而言,我确实关心用户提供的精度。如果用户输入1
,我需要将1
存储在数据库中。如果他提供1.0
,那么我需要存储1.0
。
我使用的是库的最后一个版本:12.0.3
,但我尝试了所有以前的主要版本,直到9.0.1
,它们都产生了相同的结果。
我看到了几个关于库删除尾部0的问题(报告为一个错误,在版本11.X中修复(,但没有关于添加一个的问题。
这是我应该报告的错误吗?如何覆盖此默认行为?
这不是bug,而是库的工作方式。如果你想覆盖这种行为,你需要一个自定义类型的转换器,例如:
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);