2016-10-24 243 views
1

我有一個C#程序的小問題。這是我在C#中的第一個程序 - 請原諒:)C#反序列化JSON到對象

我想將我的json文件反序列化爲對象,但我不知道我的類應該如何構建。我使用Newtonsoft JSON庫。

JSON文件:

http://api.nbp.pl/api/exchangerates/tables/A/last/?format=json


Form1.cs中:

private void button1_Click(object sender, EventArgs e) 
    { 
     CurrencyCodeValues k = new CurrencyCodeValues(); 
     WebClient myWebClient = new WebClient(); 
     dynamic result = myWebClient.DownloadString("http://api.nbp.pl/api/exchangerates/tables/A/last/?format=json"); 
     IList<CurrencyCodeValues> m = JsonConvert.DeserializeObject<CurrencyCodeValues>(result); 
    } 

的Class1.cs:

class CurrencyCodeValues 
{ 
    public string table { get; set; } 
    public string no { get; set; } 
    public string effectiveDate { get; set; } 
    public List<rates_> rates { get; set; } 

} 

public class rates_ 
{ 
    public string currency { get; set; } 
    public string code { get; set; } 
    public float mid { get; set; } 
} 

錯誤消息:

無法反序列化當前JSON陣列(例如[1,2,3])轉換爲'WindowsFormsApplication4.CurrencyCodeValues'類型,因爲該類型需要JSON對象(例如{「name」:「value」})才能正確反序列化。 要修復此錯誤,請將JSON更改爲JSON對象(例如{「name」:「value」})或將反序列化類型更改爲實現集合接口(例如ICollection,IList)的數組或類型,如List可以從JSON數組中反序列化。 JsonArrayAttribute也可以添加到類型中,以強制它從JSON數組反序列化。 路徑 '',1號線,位置1

+0

剛寫此CurrencyCodeValues米= JsonConvert.DeserializeObject (結果); –

回答

1

由於您的錯誤信息表明您的類應該是這樣的

public class Rootobject 
{ 
    public Class1[] Property1 { get; set; } 
} 

public class Class1 
{ 
    public string table { get; set; } 
    public string no { get; set; } 
    public string effectiveDate { get; set; } 
    public Rate[] rates { get; set; } 
} 

public class Rate 
{ 
    public string currency { get; set; } 
    public string code { get; set; } 
    public float mid { get; set; } 
} 

,然後deseralize它像

JsonConvert.DeserializeObject<Rootobject>(result); 
0

而deserialising JSON你需要使用基本的結構和自定義分類,因爲json不支持列表,地圖和其他保存數據的邏輯結構。這意味着你不能使用List<rates_>你需要使用rates_[]

也爲莫希特Shrivastava sugested - 你需要添加包裝類,因爲YOUT請求返回CurrencyCodeValues對象,而不是單一的對象

1

的陣列。如果你不知道您的類模型如何看起來像匹配特定的json結構,Visual Studio(自VS2013 Update 2以來)具有相當有用的功能。您可以複製您的json字符串,轉到Visual Studio,然後單擊編輯 - >選擇性粘貼 - >將JSON粘貼爲類。
現在Visual Studio將組成一個合適的類模型。


在您的情況下,它看起來像這樣(如莫希特Shrivastava已經建議):

public class Rootobject 
{ 
    public Class1[] Property1 { get; set; } 
} 

public class Class1 
{ 
    public string table { get; set; } 
    public string no { get; set; } 
    public string effectiveDate { get; set; } 
    public Rate[] rates { get; set; } 
} 

public class Rate 
{ 
    public string currency { get; set; } 
    public string code { get; set; } 
    public float mid { get; set; } 
}