我有一个简单的对象,我正在通过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
字段始终设置为0
。 CurrencyCode
字段已正确设置,因此显然反序列化不会完全失败,只有一个字段失败。
答案 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;
}
}