serialize newtonsoft jsonconvert example deserialize deserializar asp.net json asp.net-ajax serialization

asp.net - jsonconvert - newtonsoft json example



Deserializar objetos JSON como List<type> que no funciona con el servicio asmx (5)

¿Podrías mostrar la cadena JSON que intentas deserializar y la forma en que estás utilizando el método Deserialize ? Lo siguiente funciona bien:

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); } } }

Estoy teniendo problemas para deserializar mi cadena JSON. Tengo una clase de tipo person con propiedades públicas para el número de secuencia de tipo int, primer nombre y apellido. Quiero pasar una matriz de estos objetos en formato JSON y tenerlos deserializados como una lista para que pueda recorrerlos en el servidor, pero ASP.NET dice algo acerca de que no se admite que se deserialice como una matriz. He validado el JSON que estoy produciendo, y es válido. ¿Hay algo especial sobre el JSON que ASP.NET necesita tener antes de que pueda deserializarse? Lo curioso es que si serializo un objeto de lista <persona> a JSON se ve exactamente como el JSON que estoy produciendo. Debo extrañar algo ... Para aclarar, estoy usando la biblioteca ASP.NET Ajax para deserializar. Esto es lo que obtengo del servicio web:

{"Mensaje": "Tipo / 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 no se admite para la deserialización de una matriz. "

En realidad, desafortunadamente, esto no parece tener nada que ver con la deserialización, parece que no se puede pasar una matriz de objetos JSON a un servicio web de asmx. ¿Estoy en lo correcto? Si no puede hacer eso, ¿es posible pasar una colección de objetos JSON a un servicio web y procesarlos en el servidor con ASP.NET y C #?

Actualizar:

OK, aquí está mi código. Aquí está la clase de persona:

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; } }

Y aquí está mi cadena JSON:

[{"seq":1,"firstName":"Chris","lastName":"Westbrook"}, {"seq":2,"firstName":"sayyl","lastName":"westbrook"}]

Y aquí está el código que estoy usando

[WebMethod] public void updatePeople(string json) { IList<person> people = new JavaScriptSerializer().Deserialize<IList<person>>(json); //do stuff... }


Me lo imaginé. No estaba envolviendo mi JSON en un objeto como ASP.NET que Ajax requiere. Para los futuros espectadores de esta pregunta, todos los objetos JSON deben estar envueltos con un objeto principal antes de ser enviados al servicio web. La forma más fácil de hacerlo es crear el objeto en JavaScript y usar algo como json2.js para codificarlo. Además, si usa un servicio web de asmx, los objetos deben tener un atributo __type para ser serializados correctamente. Un ejemplo de esto podría ser:

var person=new object; person.firstName="chris"; person.lastName="Westbrook"; person.seq=-1; var data=new object; data.p=person; JSON.stringify(data);

Esto creará un objeto llamado p que envolverá un objeto de persona. Esto se puede vincular a un parámetro p en el servicio web. Las listas de tipo person se hacen de manera similar, acepte usar una matriz de personas en lugar de solo un objeto. Espero que esto ayude a alguien.


O incluso más simple, cuando estás haciendo el uso de $ .ajax (...)

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

y luego en el otro lado del código, haga que su función use el parámetro "clave de objeto"

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


Creo que el problema es qué tipo tienes que deserializar. Estás tratando de deserializar el tipo

IList

pero deberías intentar deserializar solo

Lista

Como la interfaz no se puede instanciar, esta podría ser la raíz del problema.


LADO DEL SERVIDOR

[WebMethod] public void updatePeople(object json)

LADO DEL CLIENTE

var person = "[{"seq":1,"firstName":"Chris","lastName":"Westbrook"} ,{"seq":2,"firstName":"sayyl","lastName":"westbrook"}]"; var str = "{''json'':''" + JSON.stringify(person) + "''}";