我有麻烦反序列化我的JSON字符串。我有一个类型的人类,具有公共属性,序列号为int,名字和姓氏。我想以JSON格式传递这些对象的数组,并将它们反序列化为一个列表,所以我可以在服务器上循环遍历它们,但是ASP.NET表示不支持将它们反序列化为数组。我已经验证了我生产的JSON,它是有效的。 ASP.NET在反序列化之前需要具备哪些特殊的JSON?有趣的是如果我序列化一个列表< person>反对JSON它看起来完全像我生产的JSON。我一定是缺少一些东西…要澄清,我正在使用ASP.NET Ajax库来反序列化。这是我从网络服务中得到的:
{“Message”:”Type \u0027System.Collections.Generic.IDictionary`2[[System.String,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.Object,PublicKeyToken=b77a5c561934e089]]\u0027 is not supported for deserialization of an array.”
实际上不幸的是,这似乎与反序列化无关,看来你不能将一组JSON对象传递给asmx Web服务。我对么?如果不能这样做,可以将JSON对象的集合传递给Web服务,并使用ASP.NET和C#在服务器上进行处理?
更新:
好的,这是我的代码。这是人类:
public class person { public person() { // // TODO: Add constructor logic here // } public int seq { get; set; } public string firstName { get; set; } public string lastName { get; set; } }
这里是我的JSON字符串:
[{"seq":1,"firstName":"Chris","lastName":"Westbrook"},{"seq":2,"firstName":"sayyl","lastName":"westbrook"}]
这里是我正在使用的代码
[WebMethod] public void updatePeople(string json) { IList<person> people = new JavaScriptSerializer().Deserialize<IList<person>>(json); //do stuff... }
解决方法
我想到了。我没有将JSON包装在像ASP.NET Ajax要求的对象中。对于此问题的未来观众,所有JSON对象必须在发送到Web服务之前用主对象包装。最简单的方法是在JavaScript中创建对象,并使用像json2.js这样的对象进行字符串化。此外,如果使用asmx Web服务,对象必须具有__type属性才能正确序列化。一个例子可能是:
var person=new object; person.firstName="chris"; person.lastName="Westbrook"; person.seq=-1; var data=new object; data.p=person; JSON.stringify(data);
这将创建一个名为p的对象,该对象将包装一个person对象。然后可以将其链接到Web服务中的参数p。类型人物的列表是类似的,接受使用一组人,而不仅仅是一个对象。我希望这有助于某人。