c# - 将小数序列化为 JSON,如何四舍五入?

标签 c# json javascriptserializer

我有课

public class Money
{
    public string Currency { get; set; }
    public decimal Amount { get; set; }
}

并希望将其序列化为 JSON。如果我使用 JavaScriptSerializer 我得到

{"Currency":"USD","Amount":100.31000}

由于 API 我必须符合需要最多两位小数的 JSON 数量,我觉得应该可以以某种方式改变 JavaScriptSerializer 序列化小数字段的方式,但我可以'不知道怎么做。有SimpleTypeResolver您可以传入构造函数,但据我所知,它仅适用于类型。 JavaScriptConverter ,您可以通过 RegisterConverters(...) 添加似乎是为 Dictionary 制作的。

我想得到

{"Currency":"USD","Amount":100.31}

在我序列化之后。此外,更改为 double 是不可能的。我可能需要做一些四舍五入(100.311 应该变成 100.31)。

有人知道怎么做吗? JavaScriptSerializer 是否有替代方法可以让您更详细地控制序列化?

最佳答案

到目前为止,我对实现这一目标的所有技术并不完全满意。 JsonConverterAttribute 似乎是最有前途的,但我无法忍受硬编码的参数和针对每种选项组合的转换器类的激增。

所以,我提交了 PR这增加了将各种参数传递给 JsonConverter 和 JsonProperty 的能力。它已被上游接受,我预计将在下一个版本中发布(无论是 6.0.5 之后的下一个版本)

然后你可以这样做:

public class Measurements
{
    [JsonProperty(ItemConverterType = typeof(RoundingJsonConverter))]
    public List<double> Positions { get; set; }

    [JsonProperty(ItemConverterType = typeof(RoundingJsonConverter), ItemConverterParameters = new object[] { 0, MidpointRounding.ToEven })]
    public List<double> Loads { get; set; }

    [JsonConverter(typeof(RoundingJsonConverter), 4)]
    public double Gain { get; set; }
}

请参阅 CustomDoubleRounding()测试一个例子。

关于c# - 将小数序列化为 JSON,如何四舍五入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12283070/

相关文章:

c# - ISupportIncrementalLoading 只触发一次

c# - 如何查看 JEnumerable<JToken> 对象中的 Children().ToList() 方法?

.net - 这似乎是 .NET 的 JavaScript 反序列化中的一个错误……是吗?

c# - 如何将匿名对象序列化为 JSON 而不包含属性名称

c# - 如何检查文本文件是否正在使用?

c# - 将 C# Type 转换为 type 数组的类型

c# - 模型中的razor foreach无法使用

java - 如何使用对象数组获取 JSONObject

javascript - Ajax 的成功和 Laravel

javascript - 如何在 ASP.NET 中将 JSON 数据格式化为 JavaScript 序列化器