将JSON对象反序列化为List <type>不使用asmx服务</type>

时间:2008-12-31 13:53:43

标签: asp.net json asp.net-ajax serialization

我无法反序列化我的JSON字符串。我有一个类型为person的类,其类型为int,first name和last name的序列号的公共属性。我想以JSON格式传递这些对象的数组,并将它们反序列化为一个列表,以便我可以在服务器上循环它们,但ASP.NET说不支持被反序列化为数组。我已经验证了我正在制作的JSON,它是有效的。 ASP.NET在反序列化之前需要具有哪些特殊的JSON?有趣的是,如果我序列化一个列表&lt; person&gt;反对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...
    }

5 个答案:

答案 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

但你应该尝试反序列化

  

列表

由于无法实例化接口,因此这可能是根本问题。