2012-05-17 2 views
2

Я пытаюсь десериализовать строку json в новый список на C# с помощью json.net.Как десериализовать Json Array в другой объект?

Когда я делаю прямую десериализацию, я получаю некоторые атрибуты как null, потому что у меня есть разные объекты в моем списке.

Так что я хочу создать «переводчик» для этой задачи, создав общие объекты и установив атрибуты моих объектов.

это мой прогресс ..

CitasProfesorWeb.JavaService.AgendaWSService service = 
    new JavaService.AgendaWSService(); 
JsonTextReader reader; 

private void cargaDatos() 
{ 
    String lista = service.obtenerCitasNuevas(2); 
    reader = new JsonTextReader(new StringReader(lista)); 

    while (reader.Read()) 
    { 
     //here i want to read the attributes or objects 
    } 
} 

я попытался с помощью JsonConvert.PopulateObject (читатель, Читинская), но я получаю сообщение об ошибке о том, что у меня есть недопустимые параметры.

--Edit--

Это строка, что я получаю:

[{"idCita":6,"fechaSolicitud":"2012/4/20","fechaCita":"2012/4/19","horario":{"idHorario":1,"fechaInicio":"2012/1/16","fechaHoy":1337281297199,"fechaFin":"2012/5/30","nombre":"Enero-Mayo 2012","profesor":{"idProfesor":2, "nombre":"Guillermo", "apellido":"Salazar", "nomUsuario":"g.salazar", "email":"[email protected]", "ubicacion":"LV323", "descripcion":"Profesor Interino"}},"alumno":{"idAlumno":1, "nombre":"Jhonatan", "apellido":"Romero", "nomUsuario":" jromero", "email":"jhonatanromgggggh", "carrera":"LSIA" },"asunto":"asesorias","status":"0","horaCita":"10:0"}, {"idCita":7,"fechaSolicitud":"2012/4/20","fechaCita":"2012/4/27","horario":{"idHorario":1,"fechaInicio":"2012/1/16","fechaHoy":1337281297199,"fechaFin":"2012/5/30","nombre":"Enero-Mayo 2012","profesor":{"idProfesor":2, "nombre":"Guillermo", "apellido":"Salazar", "nomUsuario":"g.salazar", "email":"[email protected]", "ubicacion":"LV323", "descripcion":"Profesor Interino"}},"alumno":{"idAlumno":1, "nombre":"Jhonatan", "apellido":"Romero", "nomUsuario":" jromero", "email":"jhonatanromgggggh", "carrera":"LSIA" },"asunto":"asesorias","status":"0","horaCita":"11:0"}, {"idCita":11,"fechaSolicitud":"2012/4/20","fechaCita":"2012/4/20","horario":{"idHorario":1,"fechaInicio":"2012/1/16","fechaHoy":1337281297199,"fechaFin":"2012/5/30","nombre":"Enero-Mayo 2012","profesor":{"idProfesor":2, "nombre":"Guillermo", "apellido":"Salazar", "nomUsuario":"g.salazar", "email":"[email protected]", "ubicacion":"LV323", "descripcion":"Profesor Interino"}},"alumno":{"idAlumno":1, "nombre":"Jhonatan", "apellido":"Romero", "nomUsuario":" jromero", "email":"jhonatanromgggggh", "carrera":"LSIA" },"asunto":"asesorias","status":"0","horaCita":"17:0"}, {"idCita":12,"fechaSolicitud":"2012/4/27","fechaCita":"2012/5/3","horario":{"idHorario":1,"fechaInicio":"2012/1/16","fechaHoy":1337281297199,"fechaFin":"2012/5/30","nombre":"Enero-Mayo 2012","profesor":{"idProfesor":2, "nombre":"Guillermo", "apellido":"Salazar", "nomUsuario":"g.salazar", "email":"[email protected]", "ubicacion":"LV323", "descripcion":"Profesor Interino"}},"alumno":{"idAlumno":1, "nombre":"Jhonatan", "apellido":"Romero", "nomUsuario":" jromero", "email":"jhonatanromgggggh", "carrera":"LSIA" },"asunto":"tesis","status":"0","horaCita":"12:0"}, {"idCita":15,"fechaSolicitud":"2012/5/11","fechaCita":"2012/4/20","horario":{"idHorario":1,"fechaInicio":"2012/1/16","fechaHoy":1337281297200,"fechaFin":"2012/5/30","nombre":"Enero-Mayo 2012","profesor":{"idProfesor":2, "nombre":"Guillermo", "apellido":"Salazar", "nomUsuario":"g.salazar", "email":"[email protected]", "ubicacion":"LV323", "descripcion":"Profesor Interino"}},"alumno":{"idAlumno":1, "nombre":"Jhonatan", "apellido":"Romero", "nomUsuario":" jromero", "email":"jhonatanromgggggh", "carrera":"LSIA" },"asunto":"Tesis","status":"0","horaCita":"10:0"}] 

Это мой класс:

public class Cita 
    { 
     Profesor profesor; 

     public Profesor Profesor 
     { 
      get { return profesor; } 
      set { profesor = value; } 
     } 

     Alumno alumno; 

     public Alumno Alumno 
     { 
      get { return alumno; } 
      set { alumno = value; } 
     } 

     DateTime inicioCita; 

     public DateTime InicioCita 
     { 
      get { return inicioCita; } 
      set { inicioCita = value; } 
     } 

     String asunto; 

     public String Asunto 
     { 
      get { return asunto; } 
      set { asunto = value; } 
     } 

     String lugar; 

     public String Lugar 
     { 
      get { return lugar; } 
      set { lugar = value; } 
     } 

     int status; 

     public int Status 
     { 
      get { return status; } 
      set { status = value; } 
     } 

     DateTime fechaSolicitud; 

     public DateTime FechaSolicitud 
     { 
      get { return fechaSolicitud; } 
      set { fechaSolicitud = value; } 
     } 


    } 
+0

как комментарий, я очень новый, используя Json, я сделал несколько тестов десериализации простых объектов, но на этом объекте json у меня есть объекты, вложенные – rafuru

+2

Можете ли вы опубликовать свой класс и строку json? –

+0

Я только что обновил свой вопрос :) – rafuru

ответ

3

Я хотел бы использовать dynamic, чтобы разобрать ваш JSON строка, как показано ниже (без объявления cita, horario, profesor, alumno классы)

dynamic dynObj = JsonConvert.DeserializeObject(json); 

foreach (var cita in dynObj) 
{ 
    Console.WriteLine("{0} {1} {2}", 
     cita.horario.profesor.apellido, 
     cita.alumno.nombre, 
     cita.fechaSolicitud 
     ); 
} 
+0

Я попробую :), похоже, решение! – rafuru

+0

это сработало отлично! благодаря! – rafuru

0

Вот общий класс для преобразования JSON к объектам (не забудьте включить System.Web.Script.Serialization)

public static T JsonToObject<T>(string JsonData) 
    { 
     // Deserialize the JSON into the object 
     JavaScriptSerializer jss = new JavaScriptSerializer(); 
     T rf = (T)jss.Deserialize(JsonData, typeof(T)); 

     return rf; 
    } 

Чтобы преобразовать объект обратно в JSON, использовать этот общий класс

public static string ObjectToJson<T>(T rf) 
    { 
     // Serialize the object as JSON 
     StringBuilder sb = new StringBuilder(); 
     JavaScriptSerializer jss = new JavaScriptSerializer(); 
     jss.Serialize(rf, sb); 

     return sb.ToString(); 
    } 

Как пример использования, вы бы использовали

 string json = @"[{""idCita"":6,""fechaSolicitud"":""2012/4/20"",""fechaCita"":""2012/4/19"",""horario"":{""idHorario"":1,""fechaInicio"":""2012/1/16"",""fechaHoy"":1337281297199,""fechaFin"":""2012/5/30"",""nombre"":""Enero-Mayo 2012"",""profesor"":{""idProfesor"":2, ""nombre"":""Guillermo"", ""apellido"":""Salazar"", ""nomUsuario"":""g.salazar"", ""email"":""[email protected]"", ""ubicacion"":""LV323"", ""descripcion"":""Profesor Interino""}},""alumno"":{""idAlumno"":1, ""nombre"":""Jhonatan"", ""apellido"":""Romero"", ""nomUsuario"":"" jromero"", ""email"":""jhonatanromgggggh"", ""carrera"":""LSIA"" },""asunto"":""asesorias"",""status"":""0"",""horaCita"":""10:0""}, {""idCita"":7,""fechaSolicitud"":""2012/4/20"",""fechaCita"":""2012/4/27"",""horario"":{""idHorario"":1,""fechaInicio"":""2012/1/16"",""fechaHoy"":1337281297199,""fechaFin"":""2012/5/30"",""nombre"":""Enero-Mayo 2012"",""profesor"":{""idProfesor"":2, ""nombre"":""Guillermo"", ""apellido"":""Salazar"", ""nomUsuario"":""g.salazar"", ""email"":""[email protected]"", ""ubicacion"":""LV323"", ""descripcion"":""Profesor Interino""}},""alumno"":{""idAlumno"":1, ""nombre"":""Jhonatan"", ""apellido"":""Romero"", ""nomUsuario"":"" jromero"", ""email"":""jhonatanromgggggh"", ""carrera"":""LSIA"" },""asunto"":""asesorias"",""status"":""0"",""horaCita"":""11:0""}, {""idCita"":11,""fechaSolicitud"":""2012/4/20"",""fechaCita"":""2012/4/20"",""horario"":{""idHorario"":1,""fechaInicio"":""2012/1/16"",""fechaHoy"":1337281297199,""fechaFin"":""2012/5/30"",""nombre"":""Enero-Mayo 2012"",""profesor"":{""idProfesor"":2, ""nombre"":""Guillermo"", ""apellido"":""Salazar"", ""nomUsuario"":""g.salazar"", ""email"":""[email protected]"", ""ubicacion"":""LV323"", ""descripcion"":""Profesor Interino""}},""alumno"":{""idAlumno"":1, ""nombre"":""Jhonatan"", ""apellido"":""Romero"", ""nomUsuario"":"" jromero"", ""email"":""jhonatanromgggggh"", ""carrera"":""LSIA"" },""asunto"":""asesorias"",""status"":""0"",""horaCita"":""17:0""}, {""idCita"":12,""fechaSolicitud"":""2012/4/27"",""fechaCita"":""2012/5/3"",""horario"":{""idHorario"":1,""fechaInicio"":""2012/1/16"",""fechaHoy"":1337281297199,""fechaFin"":""2012/5/30"",""nombre"":""Enero-Mayo 2012"",""profesor"":{""idProfesor"":2, ""nombre"":""Guillermo"", ""apellido"":""Salazar"", ""nomUsuario"":""g.salazar"", ""email"":""[email protected]"", ""ubicacion"":""LV323"", ""descripcion"":""Profesor Interino""}},""alumno"":{""idAlumno"":1, ""nombre"":""Jhonatan"", ""apellido"":""Romero"", ""nomUsuario"":"" jromero"", ""email"":""jhonatanromgggggh"", ""carrera"":""LSIA"" },""asunto"":""tesis"",""status"":""0"",""horaCita"":""12:0""}, {""idCita"":15,""fechaSolicitud"":""2012/5/11"",""fechaCita"":""2012/4/20"",""horario"":{""idHorario"":1,""fechaInicio"":""2012/1/16"",""fechaHoy"":1337281297200,""fechaFin"":""2012/5/30"",""nombre"":""Enero-Mayo 2012"",""profesor"":{""idProfesor"":2, ""nombre"":""Guillermo"", ""apellido"":""Salazar"", ""nomUsuario"":""g.salazar"", ""email"":""[email protected]"", ""ubicacion"":""LV323"", ""descripcion"":""Profesor Interino""}},""alumno"":{""idAlumno"":1, ""nombre"":""Jhonatan"", ""apellido"":""Romero"", ""nomUsuario"":"" jromero"", ""email"":""jhonatanromgggggh"", ""carrera"":""LSIA"" },""asunto"":""Tesis"",""status"":""0"",""horaCita"":""10:0""}]"; 
     List<Cita> p = JsonToObject<List<Cita>>(json); 

EDIT: Вы специально упомянули JSON.NET, поэтому приведенный выше код может вам не помочь, если вы хотите сохранить это. Но, чтобы проанализировать все атрибуты строки JSON, вам понадобится класс, соответствующий строке ответа JSON. Оттуда вы можете установить атрибуты других объектов по мере необходимости.

+0

Проблема, связанная с прямой десериализацией, - это ответ json, который не соответствует моему классу и отмечен как null, поэтому мне нужно извлечь атрибуты и сделать набор для каждого объекта. – rafuru

+0

@rafuru. Ваш лучший способ действий - разработать объект, который соответствует строке JSON, а затем разбивает его на другие объекты по мере необходимости. – saluce

+0

Я знаю, но клиент хочет, чтобы все это соответствовало его диаграмме классов UML .. поэтому я должен настроить -_- – rafuru

Смежные вопросы