2

json.net を使用して、json 文字列を C# の新しいリストに逆シリアル化しようとしています。

直接逆シリアル化を行うと、リストに異なるオブジェクトがあるため、一部の属性が 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(reader,cita) を使用してみましたが、無効なパラメーターがあるというエラー メッセージが表示されます。

- 編集 -

これは私が受け取っている文字列です:

[{"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":"g.salazar@itson.mx", "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":"g.salazar@itson.mx", "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":"g.salazar@itson.mx", "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":"g.salazar@itson.mx", "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":"g.salazar@itson.mx", "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; }
        }


    }
4

2 に答える 2

4

dynamic以下のようにjson文字列を解析するために使用します(、、、クラスを宣言する必要はありcitaませんhorarioprofesoralumno

dynamic dynObj = JsonConvert.DeserializeObject(json);

foreach (var cita in dynObj)
{
    Console.WriteLine("{0} {1} {2}",
        cita.horario.profesor.apellido,
        cita.alumno.nombre,
        cita.fechaSolicitud
        );
}
于 2012-05-17T19:12:40.330 に答える
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"":""g.salazar@itson.mx"", ""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"":""g.salazar@itson.mx"", ""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"":""g.salazar@itson.mx"", ""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"":""g.salazar@itson.mx"", ""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"":""g.salazar@itson.mx"", ""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);

編集:特にJSON.NETについて言及したので、それを維持したい場合、上記のコードは役に立たないかもしれません。ただし、JSON 文字列のすべての属性を解析するには、JSON 応答文字列に一致するクラスが必要になります。そこから、必要に応じて他のオブジェクトの属性を設定できます。

于 2012-05-17T19:31:08.693 に答える