Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反序列化时缺少JSON.Net构造函数参数_.net_Json_Json.net_Deserialization - Fatal编程技术网

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

反序列化时缺少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

我有一个简单的对象,我正在通过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
字段设置正确,因此显然反序列化没有完全失败,只有一个字段失败

构造函数参数命名错误

由于没有无参数构造函数,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的一个完全受支持的功能。在“提问”表单上甚至有一个复选框,用于“回答你自己的问题-分享你的知识问答风格”。