2010-04-19 13 views
32

No puedo convertir cadena JSON a objeto .net en asp.net. Estoy enviando cadena JSON del cliente al servidor utilizando campo oculto (al mantener el JSON Object.toString() en el campo oculto y leer el valor del campo oculto en el código detrás de archivo)Error al convertir JSON a objeto .Net en asp.net

cadena JSON/Objeto:

[[{"OfferId":"1","OrderValue":"11","HostingTypeID":"3"}, 
{"OfferId":"1","OrderValue":"11","HostingTypeID":"3"}, 
{"OfferId":"1","OrderValue":"11","HostingTypeID":"3"}, 
{"OfferId":"1","OrderValue":"2","HostingTypeID":"3"}, 
{"OfferId":"1","OrderValue":"2","HostingTypeID":"3"}, 
{"OfferId":"1","OrderValue":"67","HostingTypeID":"3"}, 
{"OfferId":"1","OrderValue":"67","HostingTypeID":"3"}], 
[{"OfferId":"1","OrderValue":"99","HostingTypeID":"6"}], 
[{"OfferId":"1","OrderValue":"10","HostingTypeID":"8"}]] 

.NET objeto

public class JsonFeaturedOffer 
{ 
    public string OfferId { get; set; } 

    public string OrderValue { get; set; } 

    public string HostingTypeID { get; set; } 
} 

código converstion en el código detrás de archivo

byte[] byteArray = Encoding.ASCII.GetBytes(HdnJsonData.Value); 
     MemoryStream stream = new MemoryStream(byteArray); 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JsonFeaturedOffer)); 
     object result= serializer.ReadObject(stream); 
     JsonFeaturedOffer jsonObj = result as JsonFeaturedOffer; 

Durante la conversión recibo el siguiente error:

Esperando elemento 'raíz' desde el espacio de nombres '' .. Encontrado 'Ninguno' con nombre '', espacio de nombres ''.

Respuesta

31

lugar de hacer esto manualmente yo recomendaría usar el construida en liviano JavaScriptSerializer. No se requieren atributos en las clases que desea serializar/deserializar.

También es más flexible y más rápido que el DataContractJsonSerializer, ya que no tiene que preocuparse por todas las cosas wcf. Además tiene sobrecargas genéricas que lo hacen muy simple de usar Y también puede manejar tipos anónimos.

serialización:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
var objectAsJsonString = serializer.Serialize(objectToSerialize); 

Deserialización:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
JsonFeaturedOffer deserializedObject = serializer.Deserialize<JsonFeaturedOffer>(s_JsonBaseDate); 

para que sea aún más fácil que puede crear métodos de extensión que le dará la serialización JSON/deserialización directamente sobre los objetos/cuerdas.

+0

te equivocas en una cosa: es x3-4 veces más lenta de lo que veo en mis pruebas –

+0

Esta es una respuesta de 2010, espero que el serializador json estándar haya mejorado :) – ntziolis

+0

@ntziolis Realmente no. Incluso Microsoft recomienda el uso de Newtonsoft. El rendimiento de JSON.Net es increíble. – krillgar

2

Si se trata de una matriz de matrices de JsonFeaturedOffers, no debe sea:

byte[] byteArray = Encoding.ASCII.GetBytes(HdnJsonData.Value); 
MemoryStream stream = new MemoryStream(byteArray); 
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JsonFeaturedOffer[][])); 
object result= serializer.ReadObject(stream); 
JsonFeaturedOffer[][] jsonObj = result as JsonFeaturedOffer[][]; 
+0

Gracias funcionó para mí .. –

3

Si usted quiere que la clase de auto-mágicamente en serializar JSON/XML o deserializar en el objeto que necesita para decorar con algunos atributos serializables:

[Serializable, XmlRoot("JsonFeaturedOffer"), DataContract(Name="JsonFeaturedOffer")] 
public class JsonFeaturedOffer 
{ 
    [XmlElement ("OfferId"), DataMember(Name="OfferId")] 
    public string OfferId {get; set;} 

... y así sucesivamente

+0

Gracias me ayudó y se resolvió el problema –

+0

@Vinni - ¡buenas noticias! – amelvin

66

Lamentablemente, ninguna de las soluciones propuestas resuelve el origen real del problema. Esta excepción significa que su deserializador intenta leer desde el final de una secuencia.

La solución es rebobinar la secuencia al principio, es decir. configure el stream.Position = 0; antes de la deserialización.

+2

Xactly, gracias mr.pszmyd .. – pvaju896

+2

gracias, tienes razón. Establecí la posición en 0 y todo está bien –

+2

Has resuelto mi problema. Muchas gracias. – Billdr

Cuestiones relacionadas