我无法反序列化我的JSON字符串。我有一个类型为person
的类,其类型为int,first name和last name的序列号的公共属性。我想以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,mscorlib,版本= 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]] \ u0027不支持反序列化数组。“
实际上不幸的是,这似乎与反序列化没有任何关系,看起来您无法将一组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...
}
答案 0 :(得分:26)
我明白了。我没有将我的JSON包装在像ASP.NET Ajax要求的对象中。对于此问题的未来查看者,在发送到Web服务之前,所有JSON对象必须用主对象包装。最简单的方法是在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
。类型person
的列表类似,使用一组人而不是单个对象接受。我希望这有助于某人。
答案 1 :(得分:25)
您能否显示您尝试反序列化的JSON字符串以及使用Deserialize方法的方式?以下工作正常:
using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;
namespace Test
{
class Program
{
class Person
{
public int SequenceNumber { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public static void Main()
{
string json = "[{\"SequenceNumber\":1,\"FirstName\":\"FN1\",\"LastName\":\"LN1\"},{\"SequenceNumber\":2,\"FirstName\":\"FN2\",\"LastName\":\"LN2\"}]";
IList<Person> persons = new JavaScriptSerializer()
.Deserialize<IList<Person>>(json);
Console.WriteLine(persons.Count);
}
}
}
答案 2 :(得分:6)
甚至更简单,当你在使用$ .ajax(...)时使用
data:"{\"key\":"+JSON.stringify(json_array)+"}",
然后在代码的另一端,让你的函数使用参数“object key”
[WebMethod]
public static return_type myfunction(object key){...}
答案 3 :(得分:0)
服务器端
[WebMethod]
public void updatePeople(object json)
客户端
var person = "[{"seq":1,"firstName":"Chris","lastName":"Westbrook"}
,{"seq":2,"firstName":"sayyl","lastName":"westbrook"}]";
var str = "{'json':'" + JSON.stringify(person) + "'}";
答案 4 :(得分:-2)
我认为问题是你需要反序列化的类型。您正在尝试反序列化类型
的IList
但你应该尝试反序列化
列表
由于无法实例化接口,因此这可能是根本问题。