2016-10-10 21 views
0

我有一些C#代碼,我從API獲取JSON數據反序列化JSON並顯示結果時,遇到了異常。該JSON看起來是這樣的:試圖在一個DataGridView

{ 
    "count": 32696, 
    "results": [{ 
     "data_id": 0, 
     "name": "Extended Potion of Ghost Slaying", 
     "rarity": 0, 
     "restriction_level": 0, 
     "img": "", 
     "type_id": 0, 
     "sub_type_id": 0, 
     "price_last_changed": "2013-03-18 17:00:31 UTC", 
     "max_offer_unit_price": 0, 
     "min_sale_unit_price": 0, 
     "offer_availability": 0, 
     "sale_availability": 0, 
     "sale_price_change_last_hour": 0, 
     "offer_price_change_last_hour": 0 
    }] 
} 

(有一個以上的成績只是一個項目,雖然。)

我做了2類是這樣的:

internal class MyClass 
{ 
    public int data_id { get; set; } 
    public string name { get; set; } 
    public int rarity { get; set; } 
    public int restriction_level { get; set; } 
    public string img { get; set; } 
    public int type_id { get; set; } 
    public int sub_type_id { get; set; } 
    public string price_last_changed { get; set; } 
    public int max_offer_unit_price { get; set; } 
    public int min_sale_unit_price { get; set; } 
    public int offer_availability { get; set; } 
    public int sale_availability { get; set; } 
    public int sale_price_change_last_hour { get; set; } 
    public int offer_price_change_last_hour { get; set; } 
} 

internal class RootObject 
{ 
    public int count { get; set; } 
    public List<MyClass> results { get; set; } 
} 

這裏是

using (WebClient wc = new WebClient()) 
{ 
    string URI = "a good url"; 

    wc.Headers.Add("Content-Type", "text"); 
    string HtmlResult = wc.DownloadString(URI); 
    MyClass[] result = JsonConvert.DeserializeObject<MyClass[]>(HtmlResult); 
    DataTable dt = (DataTable)JsonConvert.DeserializeObject(HtmlResult, (typeof(DataTable))); 
    this.dataGridView1.DataSource = dt; 
} 

但是當我運行此代碼我得到一個錯誤:在那裏我得到的JSON和反序列化部分

Additional information: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'gwspiderv2.MyClass[]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

我已經在另一個API上使用這種類型的代碼而沒有錯誤。我究竟做錯了什麼?

+0

呀,你已經有了JSON一(1)對象本身,而不是在一個數組,只是它的花括號坐在那裏。它在方括號之間嗎?不,這不對。在JSON中,數組是逗號分隔的方括號內的對象或值序列。你正在告訴反序列化器反序列化一個數組 - 你告訴它要在數組中堅持*。所以它尋找一個數組。相反,它發現你給了它什麼。所以它說「這不是一個數組」。 –

+1

你的原始JSON是什麼樣的?根據錯誤,它必須是JSON對象而不是數組。也許你打算將JSON反序列化爲你沒有使用的'RootObject'類型? – dbc

+0

JSON的樣子:{ 「計數」:32696, 「結果」:[{ 「data_id」:0, 「名」: 「鬼毀滅擴展藥水」, 「稀有」:0, 「restriction_level」:0,」 img「:」「,」type_id「:0,」sub_type_id「:0,」price_last_changed「:」2013-03-18 17:00:31 UTC「,」max_offer_unit_price「:0,」min_sale_unit_price「:0,」offer_availability 「:0,」 sale_availability 「:0,」 sale_price_change_last_hour 「:0,」 offer_price_change_last_hour 「:0},{」 data_id 「:1,」 名 「:」 MONSTER ONLY莫阿徒手*等 – Helmuteke

回答

1

名單在您的代碼似乎您試圖反序列化JSON相同兩種不同的方式,不使一大堆意義:

MyClass[] result = JsonConvert.DeserializeObject<MyClass[]>(HtmlResult); 
DataTable dt = (DataTable)JsonConvert.DeserializeObject(HtmlResult, (typeof(DataTable))); 

你得到的第一個錯誤(你的問題),因爲你的JSON表示單個對象,但你試圖將其反序列化到的MyClass數組。您已定義RootObject類,但您沒有使用它。看起來你應該是,因爲它適合你的JSON。

由於JSON的格式不正確,所以會出現第二個錯誤(在@inan的答案中的註釋中),以反序列化爲DataTable。大概你試圖這樣做,所以你可以在你的DataGridView顯示數據。但是,您不需要將其轉換爲DataTable即可將其用作數據源。你可以給你的DataGridView一個IList,你已經在你的RootObject已經有。

你的代碼改成這樣:

RootObject result = JsonConvert.DeserializeObject<RootObject>(HtmlResult); 
this.dataGridView1.DataSource = result.results; 
1

使用RootObject詳情如下,反序列化,它有MyClass的

RootObject result = JsonConvert.DeserializeObject<RootObject>(HtmlResult); 
+0

得到這個錯誤:附加信息:讀取DataTable時意外的JSON令牌,預期的StartArray,得到StartObject,路徑'',第1行,位置1。 – Helmuteke