2012-03-07 12 views
6

Necesito ayuda para serializar una pieza de json.DataContractJsonSerializer lanza la excepción Esperando el estado 'Element' .. Encontrado 'Text' con el nombre '', namespace ''

Recibo una respuesta de un servicio de descanso, el servicio se está volviendo json. Después de eso, quiero asignar la solicitud a una clase. Estoy usando DataContractJsonSerializer, pero no puedo hacer que funcione.

cuando los datos se serializar la excepción siguiente:

"Expecting state 'Element'.. Encountered 'Text' with name '', namespace ''. " 

Aquí está el código:

HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse(); 

Stream responseStreamm = response.GetResponseStream(); 

StreamReader reader = new StreamReader(responseStreamm); 

string streamAsString = reader.ReadToEnd(); 

MemoryStream memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(streamAsString)) {Position = 0}; 

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<MyClass>)); 

List<MyClass> myClass = (List<MyClass>)serializer.ReadObject(memoryStream); 

Y aquí es el MiClase:

[DataContract] 
public class MyClass 
{ 
    [DataMember] 
    public string RawData { get; set; } 

    [DataMember] 
    public string StudentIdentity { get; set; } 

    [DataMember] 
    public string FirstName { get; set; } 

    [DataMember] 
    public string LastName { get; set; } 

    [DataMember] 
    public string SchoolName { get; set; } 

    [DataMember] 
    public string SchoolCode { get; set; } 

    [DataMember] 
    public string TypeOfEducation { get; set; } 

    [DataMember] 
    public string EducationCode { get; set; } 

    [DataMember] 
    public string NationalProgram { get; set; } 

    [DataMember] 
    public string Objective { get; set; } 

    [DataMember] 
    public string IssuingDate { get; set; } 

    [DataMember] 
    public string GradeType { get; set; } 

    [DataMember] 
    public string ProgramRange { get; set; } 

    [DataMember] 
    public string HourTotal { get; set; } 

    [DataMember] 
    public string BasicEligibility { get; set; } 

    [DataMember] 
    public string OccupationCompetence { get; set; } 

    [DataMember] 
    public string CourseOfStudyFromSchool { get; set; } 

    [DataMember] 
    public string Software { get; set; } 

    [DataMember] 
    public string SoftwareProvider { get; set; } 

    [DataMember] 
    public string ProgramType { get; set; } 

    [DataMember] 
    public string Note { get; set; } 
} 

La respuesta de el servicio es:

"[{\"RawData\":\"\",\"StudentIdentity\":\"450101\",\"FirstName\":\"Kalle\",\"LastName\":\"Karlsson\",\"SchoolName\":\"\",\"SchoolCode\":\"SKL123\",\"TypeOfEducation\":\"\",\"EducationCode\":\"Code\",\"NationalProgram\":\"\",\"Objective\":\"Obj\",\"IssuingDate\":\"2012-01-28\",\"GradeType\":\"GradeType\",\"ProgramRange\":\"1\",\"HourTotal\":\"2000\",\"BasicEligibility\":\"BE\",\"OccupationCompetence\":\"OC\",\"CourseOfStudyFromSchool\":\"Y\",\"Software\":\"HAL213\",\"SoftwareProvider\":\"SchoolSoft\",\"ProgramType\":\"C\",\"Note\":\"Notering\",\"CourseInformation\":[{\"CourseCode\":\"ABC555\",\"Grade\":\"VG\",\"GradeDate\":\"2012-01-28\",\"Points\":\"50\",\"Comment1\":\"Kommentar1\",\"Comment2\":\"\",\"Comment3\":\"\",\"AddtionalInformation\":\"Info\",\"Exceptions\":null},{\"CourseCode\":\"DFG333\",\"Grade\":\"G\",\"GradeDate\":\"2012-01-28\",\"Points\":\"60\",\"Comment1\":\"\",\"Comment2\":\"\",\"Comment3\":\"\",\"AddtionalInformation\":\"\",\"Exceptions\":null}],\"Exceptions\":[]}]" 

Ayuda es muy apreciada!

Editar:

estoy complementando con el código de servicio:

List<MyClass> myClass = validationManager.GetXmlAsAListOfEducationInformationObject(); 

JavaScriptSerializerserializer = new JavaScriptSerializer(); 

string jsonData = serializer.Serialize(myClass); 

return jsonData; 
+0

¿Puede publicar más contexto circundante para el código de servicio? Sospecho que la capa adicional de codificación es de la capa de servicio envolviendo su cadena en una cadena JSON. Probablemente desee que su función de servicio devuelva el tipo 'List ', no 'string', y puede hacer la serialización JSON automáticamente. Depende de lo que estés usando para el servicio. –

Respuesta

6

Tuve el mismo problema.

Estaba enviando un objeto JSON desde el cliente (jQuery con navegador) a mi aplicación de servidor (IIS-ASP.NET usando C#).

El JSON incluye objetos internos JSON y existe el problema.

A continuación, enumero el objeto JSON (en una versión mínima para el caso de ejemplo), las clases C# que deben construirse y el código que deserializa el JSON a las clases de datos C#.

JSON objeto:

"{"Conference_id":"9","SubmissionType":{"Value":"1"},"TextPublishType":[{"Value":"12"},{"Value":"9"}],"Title":"aTitle"}" 

Sé cuidado: La propiedad SubmissionType incluye un JSON interior como su valor y la propiedad TextPublishType incluye una serie de objeto JSON como su valor.

C# clase que debe ser construido (depende de la estructura JSON):

public class Abstract 
{ 
    public int Conference_id { get; set; } 
    public SubmissionTypeClass SubmissionType { get; set; } 
    public List<TextPublishTypeClass> TextPublishType{ get; set; } 
} 

El SubmissionType define como una clase diferente causa que incluye un objeto JSON interior.
El TextPublishType definido como una lista de una clase diferente porque incluye un objeto JSON de matriz interna.

public class SubmissionTypeClass 
{ 
    public int Value { get; set; } 
} 

public class TextPublishTypeClass 
{ 
    public int Value { get; set; } 
} 

Estas dos clases incluyen una sola propiedad.Esto se debe a que en el objeto JSON, el JSON interno incluye solo una propiedad (Valor). Este es un ejemplo simple solo para el caso de respuesta. Si desea más propiedades en el objeto JSON, debe definirlas con el mismo nombre de clave en la definición de clase.

El código deserialización:

Abstract theAbstract = Activator.CreateInstance<Abstract>(); 
MemoryStream memoryStream = new MemoryStream(Encoding.Unicode.GetBytes("the above JSON text")); 
DataContractJsonSerializer serializer = new DataContractJsonSerializer(theAbstract.GetType()); 
theAbstract = (Abstract)serializer.ReadObject(memoryStream); 
memoryStream.Dispose(); 

Para más compleja JSON objetos el único que hay que hacer es crear una estructura de clases más complejo.
Espero que ayude.

+0

Gracias George: la persona realmente debería darle el estado de respuesta correcto. –

+0

Sí, marque esto como la respuesta. – DelftRed

0

Esa respuesta de servicio funciona cuando deserializar, lo que me lleva a sospechar que su baile extra con el MemoryStream está causando una corriente nula en alguna parte. Simplemente simplifíquelo y pase la secuencia de respuesta directamente al serializador:

HttpWebResponse response = webRequest.GetResponse(); 
var serializer = new DataContractJsonSerializer(typeof(List<MyClass>)); 
var list = (List<MyClass>)serializer.ReadObject(response.GetResponseStream()); 
+0

Me temo que esto genera la misma excepción que experimenté en el código original. – FatAlbert

Cuestiones relacionadas