【问题标题】:JsonConvert.PopulateObject() is not handling the decimal type data properlyJsonConvert.PopulateObject() 未正确处理小数类型数据
【发布时间】:2019-09-10 08:48:43
【问题描述】:

我有一个 JSON 字符串:

{"PaymentVoucherNumber":15,"PaymentVoucherDate":"2019-09-10T00:00:00","pvExpiryDate":"2019-09-22T00:00:00","Amount":35.000,"ReceiptNumber":0}

在这个 json 中,Amount 是一个双精度值。

public partial class VoucherList 
{
    [JsonProperty("PaymentVoucherNumber")]
    public long PaymentVoucherNumber { get; set; }

    [JsonProperty("PaymentVoucherDate")]
    public string PaymentVoucherDate { get; set; }

    [JsonProperty("pvExpiryDate")]
    public string PvExpiryDate { get; set; }

    [JsonProperty("Amount")]
    public double Amount { get; set; }

    [JsonProperty("ReceiptNumber")]
    public long ReceiptNumber { get; set; }
}

我使用了 JsonConvert.PopulateObject()。但在结果中,金额字段以小数部分的形式出现。即只有 35

VoucherList pv=new VoucherList();
JsonConvert.PopulateObject(json,pv);

请指教...

【问题讨论】:

  • 您是否尝试过使用小数部分不同于 X.0 的十进制数?例如用 35.2 而不是 35.0 它应该保留十进制数。
  • 您的数据模型没有任何decimal 属性,它有doubledouble 不存储数字; decimaldoes.

标签: c# json json.net


【解决方案1】:

您的问题是,在您的数据模型中,您使用 double 而不是 decimal 代表 Amount

[JsonProperty("Amount")]
public double Amount { get; set; }

你需要把它改成decimal:

[JsonProperty("Amount")]
public decimal Amount { get; set; }

当你这样做时,JSON 中的小数位数将被记住在 decimal 结构中。这是可能的,因为正如docs 中所述:

十进制数是一个浮点值,它包含一个符号、一个数值,其中每个数字的范围从 0 到 9,以及一个比例因子,该比例因子表示分隔整数的浮点小数点的位置和数值的小数部分。 ...

缩放因子还保留十进制数中的任何尾随零。尾随零不会影响算术或比较运算中的 Decimal 数的值。但是,如果应用了适当的格式字符串,ToString 方法可能会显示尾随零。

double 没有这种能力,它是纯粹的 IEEE 754 二进制浮点表示,因此无法区分 3535.035.0000。因此,当您在填充后检查 pv.Amount 时,会针对 35.0 JSON 值显示 35

示例fiddle

【讨论】:

    猜你喜欢
    • 2016-01-13
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多