Подтвердить что ты не робот

Удаление десериализации объектов JSON как List <type> не работает с asmx-сервисом

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

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

На самом деле, к сожалению, это не имеет никакого отношения к десериализации, кажется, что вы не можете передать массив объектов JSON в веб-службу asmx. Я прав? Если вы не можете этого сделать, можно ли передать коллекцию объектов JSON в веб-службу и обработать их на сервере с помощью ASP.NET и С#?

Обновление:

ОК, вот мой код. Вот класс человека:

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...
    }
4b9b3361

Ответ 1

Я понял это. Я не обматывал свой 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, который будет обертывать объект person. Затем это можно связать с параметром p в веб-службе. Списки типа person создаются аналогичным образом, принимают использование массива лиц, а не только одного объекта. Надеюсь, это поможет кому-то.

Ответ 2

Не могли бы вы показать строку 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);
        }
    }
}

Ответ 3

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

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

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

[WebMethod]
public static return_type myfunction(object key){...}

Ответ 4

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

[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) + "'}";

Ответ 5

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

IList

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

Список

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