Newsoft Json 反序列化为产品 Collection 不工作

Newsoft Json deserialize into products Collection not working

我正在创建一个 windows phone silver light 8 应用程序。

我有一个 Json 字符串,我正在尝试将其转换为 object 的列表,每个 object 都是 [=63 的 object =] classed "Product" 并且列表应该是产品。最终我希望它转换为 Observable collection 以便我可以将 collection 绑定到我的 windows Silverlight phone 应用程序中的列表框。

这是我的class

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.

这是我的collection绑定

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

错误 >> 首先,我遇到了解析错误,所以我转义了字符串中的所有引号,如下所示 \" **>>**但后来它只是转换为 object 之类的普通字符串,但我想转换为 collection 类型的产品 "Product"

>>异常

附加信息:无法将当前 JSON object(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[PivotApp1.Product]'因为该类型需要 JSON 数组(例如 [1,2,3])才能正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是原始类型像整数,而不是像数组或列表这样的 collection 类型),可以从 JSON object 反序列化。 JsonObjectAttribute 也可以添加到类型以强制它从 JSON object.

反序列化

路径 'products',第 1 行,位置 12。

提前致谢

必须更改您的 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

,您需要另一个包含产品集合的对象作为 属性 称为产品

这可能不是最好的解决方案,但它有效:

创建另一个 class:

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

使用此代码反序列化您的 JSON:

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

如果您可以控制 JSON 字符串,您可以考虑将其更改为此(删除 'products' 属性 并最终在 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);

你可以用这种方式反序列化它(但你必须以某种方式重新格式化你的 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);

更多信息 --> Deserialize a collection

无需按照建议创建另一个 class!

编辑: 实际上你得到这个异常是因为你的 JSON 字符串代表一个包含 'Product' 列表的对象 'products' 而这与你的根 class.[=18= 没有直接关系]

这是你目前的 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 的建议进行操作(通过新的 "RootClass")。