反序列化时缺少JSON.Net构造函数参数
我有一个简单的对象,我正在通过JSON往返。它序列化得很好,但我反序列化了它,其中一个值被设置为默认值(在本例中为0)。为什么呢 这是我的目标:反序列化时缺少JSON.Net构造函数参数,.net,json,json.net,deserialization,.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 cu
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
字段设置正确,因此显然反序列化没有完全失败,只有一个字段失败 构造函数参数命名错误
由于没有无参数构造函数,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;
}
}
我很好奇为什么投反对票?由于有人刚刚通过投票否决了我自己回答的另外两个问题,我只想指出,这实际上是StackOverflow的一个完全受支持的功能。在“提问”表单上甚至有一个复选框,用于“回答你自己的问题-分享你的知识问答风格”。