Десериализация объектов JSON как List <type>не работает с сервисом asmx - PullRequest
19 голосов
/ 31 декабря 2008

У меня проблемы с десериализацией строки JSON. У меня есть класс типа person с открытыми свойствами для порядкового номера типа int, имени и фамилии. Я хочу передать массив этих объектов в формате JSON и десериализовать их в виде списка, чтобы я мог просматривать их на сервере, но ASP.NET говорит, что не поддерживается десериализация в виде массива. Я проверил JSON, который я создаю, и он действителен. Есть ли в JSON что-то особенное, что нужно ASP.NET для десериализации? Самое смешное, что если я сериализую объект list в JSON, он будет выглядеть точно так же, как и JSON, который я создаю. Я должен что-то упустить ... Чтобы уточнить, я использую библиотеку ASP.NET Ajax для десериализации. Вот что я получаю от веб-сервиса:

{"Сообщение": "Тип \ u0027System.Collections.Generic.IDictionary`2 [[System.String, mscorlib, Версия = 2.0.0.0, Культура = нейтральный, PublicKeyToken = b77a5c561934e089], [System.Object, mscorlib, Версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089]] \ u0027 не поддерживается для десериализации массива. "

На самом деле, к сожалению, это не имеет ничего общего с десериализацией, похоже, вы не можете передать массив объектов JSON в веб-службу asmx. Я прав? Если вы не можете этого сделать, возможно ли передать коллекцию объектов JSON в веб-службу и обработать их на сервере с помощью 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 ]

26 голосов
/ 02 января 2009

Я понял это. Я не оборачивал свой JSON в объект, который требует ASP.NET Ajax. Для будущих читателей этого вопроса все объекты JSON должны быть обернуты основным объектом перед отправкой в ​​веб-сервис. Самый простой способ сделать это - создать объект в JavaScript и использовать что-то вроде json2.js для его строкового преобразования. Кроме того, при использовании веб-службы asmx объекты должны иметь атрибут __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, который обернет объект человека. Затем это может быть связано с параметром p в веб-сервисе. Списки типа person составляются аналогично, допускается использование массива лиц вместо одного объекта. Надеюсь, это кому-нибудь поможет.

25 голосов
/ 31 декабря 2008

Не могли бы вы показать строку JSON, которую вы пытаетесь десериализовать, и способ, которым вы используете метод Десериализация ? Следующее работает отлично:

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);
        }
    }
}
6 голосов
/ 13 августа 2012

Или даже проще, когда вы используете $ .ajax (...), используйте

data:"{\"key\":"+JSON.stringify(json_array)+"}",

и затем на другой стороне кода заставьте вашу функцию использовать параметр "ключ объекта"

[WebMethod]
public static return_type myfunction(object key){...}
0 голосов
/ 07 августа 2013

СТОРОНА СЕРВЕРА

[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) + "'}";
0 голосов
/ 24 сентября 2012

Я думаю, проблема в том, какой тип вы должны десериализовать. Вы пытаетесь десериализовать тип

IList

но вы должны попытаться десериализовать только

Список

Поскольку интерфейс не может быть создан, это может быть основной проблемой.

...