我正在创建一个Windows phone银光8应用程序。
我有一个Json字符串,我正在尝试将其转换为一个对象列表,每个对象都是一个类的对象" Product"和列表应该是产品。最终我希望它转换为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; }
错误 &gt;&gt; 首先我得到了解析错误,所以我在字符串中转义了所有引号,如 \&#34; **&gt;&gt; **但是它只是转换为像对象一样的普通字符串,但我想转换为&#34; Product&#34;
类型的产品集合&GT;&GT;例外
附加信息:无法将当前JSON对象(例如{&#34; name&#34;:&#34; value&#34;})反序列化为类型&System; System.Collections.Generic.List `1 [PivotApp1.Product]&#39;因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。 要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。
路径&#39;产品&#39;,第1行,第12位。
提前致谢
答案 0 :(得分: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}]}";
您需要另一个带有Product集合的对象作为名为products的属性才能反序列化您的JSON
这可能不是最好的解决方案,但它有效:
创建另一个类:
public class RootObject
{
public List<Product> products;
}
使用此代码反序列化您的JSON:
var pds = JsonConvert.DeserializeObject(PDS, typeof(RootObject));
如果您控制了JSON字符串,可以考虑将其更改为此(删除&#39;产品&#39;属性,最后只使用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}]";
然后您可以使用TaiT提出的解决方案(直接反序列化到产品列表):
var pds = JsonConvert.DeserializeObject<List<Product>>(PDS);
答案 1 :(得分: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}]}";
//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.
然后
var pds = JsonConvert.DeserializeObject<List<Product>>(PDS);
更多信息 - &gt; Deserialize a collection
无需按照建议创建另一个类!
编辑: 实际上你得到了这个例外,因为你的JSON字符串代表了一个对象&#39;产品&#39;包含&#39;产品&#39;的列表这与你的根类没有直接关系。
这就是您当前的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}]";
代表如下(注意细微差别):
使用此JSON字符串,它将不会引发任何异常:
var pds = JsonConvert.DeserializeObject<List<Product>>(PDS);
或者,如果您无法在PDS中更改生成的JSON字符串,则可以执行J. Tuc建议的内容(通过新的&#34; RootClass&#34;)。