2017-02-27 95 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