Удаление десериализации объектов 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...
}
Ответы
Ответ 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.