Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Newsoft Json反序列化到产品集合不起作用_C#_Json_Silverlight_Collections_Json Deserialization - Fatal编程技术网

C# Newsoft Json反序列化到产品集合不起作用

C# Newsoft Json反序列化到产品集合不起作用,c#,json,silverlight,collections,json-deserialization,C#,Json,Silverlight,Collections,Json Deserialization,我正在创建一个windows phone silver light 8应用程序 我有一个Json字符串,我试图将它转换成一个对象列表,每个对象都是一个类为“Product”的对象,列表应该是Product。最终,我希望它转换为可观察的集合,以便我可以将该集合绑定到我的windows Silverlight手机应用程序中的列表框 这是我的课 public class Product { public string _id { get; set; } public string co

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

我有一个Json字符串,我试图将它转换成一个对象列表,每个对象都是一个类为“Product”的对象,列表应该是Product。最终,我希望它转换为可观察的集合,以便我可以将该集合绑定到我的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.
var PDS=“{\”产品\:[{\”\u id\:“58b2\”,“代码\:“59034\”,“名称\:“somename1\”,“imgAddress\:\”https://someimageurl/.../.jpg\“,”queryCount\“:0},“{\”\u id\”:“58b3\”,“code\”:“59035\”,“name\”:“somename2\”,“imgAddress\”:\”https://someimageurl2/.../.jpg\“,\“queryCount\”:1}]}”;
var pds=JsonConvert.DeserializeObject(pds);
//PDS实际上是很长的字符串,数组产品有很多对象,但为了简单起见,我在这里只写了两个产品。
这是我的装订收藏

public ObservableCollection<Product> Products { get; set; }
publicobservableCollection产品{get;set;}
错误 >首先,我遇到了解析错误,因此我将字符串中的所有引号都转义为\“ **>>**但是它只是转换成一个普通的类似字符串的对象,但我想转换成一个“Product”类型的产品集合

>例外情况

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.
其他信息:无法将当前JSON对象(例如{“名称”:“值”})反序列化为“System.Collections.Generic.List`1[PivotApp1.Product]”类型,因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。 要修复此错误,请将JSON更改为JSON数组(例如[1,2,3]),或更改反序列化类型,使其成为普通的.NET类型(例如,不是整数之类的基元类型,也不是数组或列表之类的集合类型)也可以将JsonObjectAttribute添加到类型中,以强制其从JSON对象反序列化

路径“产品”,第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,您需要另一个对象,该对象将Product集合作为名为products的属性

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

创建另一个类:

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

如果您在控制JSON字符串,您可以考虑将其更改为此(删除“产品”属性,并仅用JSON字符串中的一系列产品结束):

然后您可以使用TaiT提出的解决方案(直接反序列化到产品列表):

var pds=JsonConvert.DeserializeObject(pds);

您可以通过这种方式对其进行反序列化(但您必须以某种方式重新格式化JSON字符串):

然后

如下所示(注意细微差别):

使用此JSON字符串,它将不会引发异常:

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

或者,如果您不能在PDS中更改生成的JSON字符串,您可以按照J.Tuc的建议(通过一个新的“RootClass”)进行操作.

您提供的代码甚至无法编译。请提供一个。它可以工作,但您是对的,它不是最好的解决方案,速度很慢。非常感谢:)我已经尝试过这个方法,它给了我一个异常,请看现在的帖子,我只是用异常更新了它。只是出于好奇,哪种方法更好?性能更好ise?我做了快速测试,它在性能方面没有任何变化,因为由于额外的“产品”,您解析的字符串只会多出几个字节。这对性能没有影响。只需使用可读性更好的字符串。在您的情况下,我会按照我的建议更改JSON字符串,使其真正符合您的预期类型,即是列表。因此,使用ObservableCollection进行绑定非常容易。
var pds = JsonConvert.DeserializeObject<List<Product>>(PDS);
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);
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);