2017-02-27 34 views
2

我正在創建一個Windows Phone銀光8應用程序。Newsoft Json反序列化成產品集合不起作用

我有一個JSON字符串,我試圖將其轉換爲對象列表,每個對象是一個類歸類爲「產品」的對象,列表應該是產品。最終我希望它轉換爲Observable集合,以便我可以將該集合綁定到我的Windows Silverlight手機應用程序的列表框中。

這裏是我的類

public class Product 
{ 
    public string _id { get; set; } 
    public string code { get; set; } 
    public string name { get; set; } 
    public string imgAddress { get; set; } 
    public int queryCount { get; set; } 
} 

這裏是代碼反序列化JSON

var PDS = "{\"products\":[{\"_id\":\"58b2\",\"code\":\"59034\",\"name\":\"somename1\",\"imgAddress\":\"https://someimageurl/.../.jpg\",\"queryCount\":0},{\"_id\":\"58b3\",\"code\":\"59035\",\"name\":\"somename2\",\"imgAddress\":\"https://someimageurl2/.../.jpg\",\"queryCount\":1}]}"; 
var pds = JsonConvert.DeserializeObject<List<Product>>(PDS); 
//PDS is actually very long string and the array products has a lot of objects but I am only writing 2 products here for simplicity. 

這是我收集綁定

public ObservableCollection<Product> Products { get; set; } 

錯誤 >>首先我正在解析錯誤,所以我逃過這樣字符串中的所有引號\」 ** ** >>但後來它只是轉換爲普通的字符串狀物體,但我要轉換的類型「產品」的產品集合

>>異常

其他信息:無法反序列化JSON當前對象(例如{「name」:「value」})轉換爲類型'System.Collections.Generic.List`1 [PivotApp1.Product]',因爲該類型需要JSON數組(例如[1,2,3])才能正確地反序列化。 要修復此錯誤,請將JSON更改爲JSON數組(例如[1,2,3])或更改反序列化的類型,以使其爲正常的.NET類型(例如,不是像整數這樣的基本類型,也不是集合類型像數組或列表),可以從JSON對象反序列化。 JsonObjectAttribute也可以添加到類型中,以強制它從JSON對象反序列化。

Path'products',line 1,position 12。

預先感謝

+1

您提供的代碼甚至不會編譯。請提供[mcve]。 –

回答

1

你可以反序列化這種方式(但你必須以某種方式重新格式化你的JSON字符串):從

var PDS = "{"products":[{"_id":"58b2","code":"59034","name":"somename1","imgAddress":"https://someimageurl/.../.jpg","queryCount":0},{"_id":"58b3","code":"59035","name":"somename2","imgAddress":"https://someimageurl2/.../.jpg","queryCount":1}]}"; 
//PDS is actually very long string and the array products has a lot of objects but I am only writing 2 products here for simplicity. 

var PDS = "[{'_id':'58b2','code':'59034','name':'somename1','imgAddress':'https://someimageurl/.../.jpg','queryCount':0},{'_id':'58b3','code':'59035','name':'somename2','imgAddress':'https://someimageurl2/.../.jpg','queryCount':1}]"; 
//PDS is actually very long string and the array products has a lot of objects but I am only writing 2 products here for simplicity. 

Then

var pds = JsonConvert.DeserializeObject<List<Product>>(PDS); 

更多相關信息 - >Deserialize a collection

無需創建另一個類的建議的!

編輯: 其實你會得到這個異常,因爲你的JSON字符串表示一個包含'產品'列表的對象'產品',這並不直接與你的根類相關。

這是您當前JSON的樣子:

Your current JSON string

你的JSON字符串的結果應該是類似的東西,而不是:

var PDS = "[{'_id':'58b2','code':'59034','name':'somename1','imgAddress':'https://someimageurl/.../.jpg','queryCount':0},{'_id':'58b3','code':'59035','name':'somename2','imgAddress':'https://someimageurl2/.../.jpg','queryCount':1}]"; 

代表如下(注意略有差異):

Correct JSON string for List<Product> type

使用該JSON字符串,它會也不例外提出工作:

var pds = JsonConvert.DeserializeObject<List<Product>>(PDS); 

或者,如果你不能改變在PDS產生的JSON字符串,你可以做什麼J. TUC建議(通過新的「 RootClass「)。

+0

我已經嘗試過這種方法,它給了我一個例外,請現在看到帖子,我只是用例外更新它。 – touseef

+0

請參閱我剛剛更新的編輯。 –

+0

是的,它的作品非常感謝:) – touseef

2

您的JSON字符串,就必須改變以獲得代碼編譯:

var PDS = "{'products':[{'_id':'58b2','code':'59034','name':'somename1','imgAddress':'https://someimageurl/.../.jpg','queryCount':0},{'_id':'58b3','code':'59035','name':'somename2','imgAddress':'https://someimageurl2/.../.jpg','queryCount':1}]}"; 

你需要另一個對象與產品的集合作爲一個屬性叫做產品爲了反序列化你的JSON

這可能不是最好的解決方案,但它的工作原理:

創建另一個類:

public class RootObject 
{ 
    public List<Product> products; 
} 

使用此代碼反序列化JSON:

var pds = JsonConvert.DeserializeObject(PDS, typeof(RootObject)); 

,如果你在你的JSON字符串的控制,你可能會考慮將其更改爲這個(刪除「產品」屬性與只是一個在JSON字符串的產品陣列)結束了:

var PDS = "[{'_id':'58b2','code':'59034','name':'somename1','imgAddress':'https://someimageurl/.../.jpg','queryCount':0},{'_id':'58b3','code':'59035','name':'somename2','imgAddress':'https://someimageurl2/.../.jpg','queryCount':1}]"; 

這時,你可能能夠使用由泰特的(反序列化提出的解決方案直接把產品的列表):

var pds = JsonConvert.DeserializeObject<List<Product>>(PDS); 
+0

它的工作原理,但是,你是對的,它不是最好的解決方案,它很慢。非常感謝:) – touseef