小编jla*_*ery的帖子

如何使用Json.NET反序列化高精度十进制值?

我想将包含长十进制值的JSON反序列化为自定义类型以保持其精度(即自定义BigDecimal类).我正在使用Json.NET 9.0.1和.NET 4.6.1.我已经尝试过使用JsonConverter,但是看起来调用ReadJson时可用的值已经被Json.NET识别并读取为.NET十进制类型并且仅限于其精度.

理想情况下,我可以访问原始字符串,所以我可以将它放在自定义类型中.我可以在目标对象上使用字符串属性,并对完整字符串进行反序列化,但之后我必须进一步处理该对象(即,将其复制到另一个表示中),这在大型模式中尤其混乱.

有关更好方法的任何想法?


这是目标类:

public class DecimalTest
{
    public string stringValue { get; set; }
    public decimal decimalValue { get; set; }
    public BigDecimal bigDecimalValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是使用JSON的测试:

    [TestMethod]
    public void ReadBigDecimal_Test()
    {
        var json = @"{
            ""stringValue"" : 0.0050000012852251529693603515625,
            ""decimalValue"" : 0.0050000012852251529693603515625,
            ""bigDecimalValue"" : 0.0050000012852251529693603515625
        }";

        var settings = new JsonSerializerSettings();
        settings.FloatParseHandling = FloatParseHandling.Decimal;
        settings.Converters.Add(new JsonBigDecimalConverter());

        var result = JsonConvert.DeserializeObject<DecimalTest>(json, settings);

        Assert.IsNotNull(result);
        Assert.AreEqual("0.0050000012852251529693603515625", result.stringValue);
        Assert.AreEqual(0.0050000012852251529693603516m, result.decimalValue);

        // *** This case fails ***
        Assert.AreEqual("0.0050000012852251529693603515625", result.bigDecimalValue.ToString()); …
Run Code Online (Sandbox Code Playgroud)

c# json json.net deserialization json-deserialization

6
推荐指数
1
解决办法
1990
查看次数