反序列化时缺少JSON.Net构造函数参数

时间:2014-02-12 16:31:42

标签: .net json json.net deserialization

我有一个简单的对象,我正在通过JSON进行四舍五入。它序列化很好,但我反序列化其中一个值设置为默认值(在这种情况下为0)。这是为什么?

这是我的目标:

public class CurrencyExchangeRate
{
    public string CurrencyCode { get; private set; }
    public decimal Rate { get; private set; }

    public CurrencyExchangeRate(string currencyCode, decimal exchangeRate)
    {
        this.CurrencyCode = currencyCode;
        this.Rate = exchangeRate;
    }
}

此序列化为JSON,如{"CurrencyCode":"USD", "Rate": 1.10231}。但是当我反序列化时,Rate字段始终设置为0CurrencyCode字段已正确设置,因此显然反序列化不会完全失败,只有一个字段失败。

1 个答案:

答案 0 :(得分:6)

构造函数参数名称错误。

因为没有无参数构造函数,JSON.net被迫使用带参数的构造函数并为这些参数提供值。它尝试通过比较它们的名称来匹配JSON字符串中的字段和构造函数的参数。这适用于货币代码,因为CurrencyCode足够接近currencyCode。但是JSON字段名Rate与构造函数参数exchangeRate太不一样了,所以JSON.net无法弄清楚它们是同一个东西。因此,在这种情况下,它会传递该类型的默认值0m。将构造函数参数名称更改为rate将解决问题。

public class CurrencyExchangeRate
{
    public string CurrencyCode { get; private set; }
    public decimal Rate { get; private set; }

    //NOTE changed parameter name!
    public CurrencyExchangeRate(string currencyCode, decimal rate)
    {
        this.CurrencyCode = currencyCode;
        this.Rate = rate;
    }
}