2014-02-12 100 views
2

我有一個簡單的對象,我正在通過JSON進行循環。它序列化很好,但我反序列化它的一個值被設置爲默認值(在這種情況下爲0)。這是爲什麼?反序列化時缺少JSON.Net構造函數參數

這是我的目標:

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字段被正確設置,所以清晰的反序列化並不是完全失敗,只是一個字段失敗。

+0

我很好奇downvote是什麼?由於有人剛剛通過並且低估了我自己回答的其他兩個問題,我只想指出這實際上是StackOverflow的一項完全支持的功能。在「提問」表格中甚至有一個「回答你自己的問題 - 分享你的知識問答風格」複選框。 –

回答

5

構造函數參數名稱錯誤。

因爲沒有無參數構造函數,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; 
    } 
} 
相關問題