2016-09-21 17 views
0

我在C#中使用JSON.net作爲Excel VSTO添加並通過Web服務拉入JSON。.NET的JSON序列化例外C#

我已驗證JSON我拉是有效的(在線JSON驗證器),但無法將JSON轉換爲C#中的對象使用。

當我運行下面的代碼時,我得到下面的異常。

關於誰可以正確隱藏JSON的任何想法?

例外:

Newtonsoft.Json.JsonSerializationException: 

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

To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type 
(e.g. not a primitive type like integer, not a collection type like an array or List<T>) 
that can be deserialized from a JSON object. 
JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. 

代碼:

public async Task<string> getline() 
{ 
    <--- Set Client, Execute Request ---> 

    //JSON content shown below 
    string content = await response.Content.ReadAsStringAsync(); 

    RootObject[] dims = JsonConvert.DeserializeObject<RootObject[]>(content); 

    return content; 
} 

public class RootObject 
{ 
    public List<string> ledger { get; set; } 
    public List<string> ledgerAlias { get; set; } 
    public List<string> entity { get; set; } 
    public List<string> entityAlias { get; set; } 
    public List<string> scenario { get; set; } 
    public List<string> period { get; set; } 
    public List<string> location { get; set; } 
    public List<string> measures { get; set; } 
} 

JSON:

{ 
"acc":["A","B"], 
"accAlias":["ACE","BCE"], 
"company":["PEP", "KO"], 
"companyAlias":["Pepsi", "Coco-Cola"], 
"scenario":["Sales", "Expenses"], 
"year": ["2016","2017"], 
"areaCode":["123","131","412"], 
"clients":["32340-0120","3031-0211","3412-0142"] 
} 
+3

您正試圖反序列化一個RootObjects數組,但它只是一個對象。將RootObject []更改爲RootObject – Nico

+0

聽起來好像你在問什麼是「數組」這個詞。但錯誤消息*實際上告訴你它的含義*。 –

+2

此外,您的對象定義與您的JSON不匹配 – Nico

回答

1

的JSON表示對象,而不是一個陣列的單個實例。因此,而不是這樣的:

RootObject[] dims = JsonConvert.DeserializeObject<RootObject[]>(content) 

使用這樣的:

RootObject dims = JsonConvert.DeserializeObject<RootObject>(content) 

相反地,如果是一個陣列中,使JSON本身的陣列(包含單個元素)通過用括號包圍它:

[{ 
"acc":["A","B"], 
"accAlias":["ACE","BCE"], 
"company":["PEP", "KO"], 
"companyAlias":["Pepsi", "Coco-Cola"], 
"scenario":["Sales", "Expenses"], 
"year": ["2016","2017"], 
"areaCode":["123","131","412"], 
"clients":["32340-0120","3031-0211","3412-0142"] 
}] 

編輯:正如其他人也指出的那樣,JSON對象上的屬性實際上並不匹配該類定義。因此,雖然它可能「成功」反序列化,但這樣做會忽略它不關心的JSON屬性,並初始化爲類屬性的默認值。

也許你打算使用不同的類?或者不同的JSON?或者在一個或另一箇中重命名一個或多個屬性?

無論哪種方式,單個實例和實例數組之間的差異是直接的問題。但在糾正這個問題時,你會轉向下一個問題。

0

的RootObject和JSON是不兼容的。你可以使用字典反序列化。嘗試:

var dims = JsonConvert.DeserializeObject<Dictionary<string, string[]>>(content);