我有一个WebAPI服务,该服务返回具有十进制值的值字段的对象。问题是当值为10.00时,我将收到以下JSON:
{
"value" : 10
}
,但我想要
{
"value" : 10.00
}
public class SomethingDto
{
public decimal value { get; set; }
}
我正在与jsonConverters一起玩,但不能完全掌握我需要做的事情才能使我的服务输出10.00而不是十进制属性的10个。有人知道如何解决这个问题吗?
如果您真的希望在JSON中格式化该值,并且在解析时仍然保留一个数字,则可以使用自定义JsonConverter
进行此操作。但是,请注意,当客户用标准解析器解析JSON时,格式将丢失。这是因为格式不是用数字值存储的。保留格式的唯一方法是将数字作为字符串输出,如其他几个人所述。
这是转换器所需的代码:
public class DecimalConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(decimal));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteRawValue(((decimal)value).ToString("0.00"));
}
public override bool CanRead
{
get { return false; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
小提琴:https://dotnetfiddle.net/jkzk4b
要将此转换器与Web API一起使用,您需要将其插入配置。将其添加到WebApiConfig
类中的Register
方法:
var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings;
jsonSettings.Converters.Add(new DecimalConverter());
注意:如果您确实决定要输出小数作为预先格式化的字符串而不是数字,则可以将相同的转换器与一个小更改一起使用。在WriteJson
方法中,将WriteRawValue
更改为WriteValue
。
小提琴:https://dotnetfiddle.net/jxjmrz
您可能需要为此使用字符串返回类型,并且在您的Get属性中使用string.format将值返回到所需的小数位置。或者您可以在JSONConverter中尝试此功能
如果要获得无法更改的原始数据的值,请尝试更改数据层中的格式。
decimal value_formatted = Decimal.Parse(value.ToString("0.00"));
这将为您提供一般2个小数点的综述。
value.ToString("0.00")
可能是您应采取的措施,以确保在值具有 .00