none
Consulta sobre arreglo JSON desde Servicio WCF RRS feed

  • Pregunta

  • Estoy ejecutando procedimientos almacenados en mi proyecto WCF C#. De uno de mis SP recibo algo asi :

    CeldaId
    CeldaIndicadorCodigo
    CeldaIndicadorTipoCodigo

    Luego con el valor de Celda Id llamo a otro SP que me trae :

    CeldaKeyCodigo
    CeldaKeyValor

    Desde el primer SP obtengo CeldaId y con ese valor obtengo los resultados del segundo SP.

    Mi idea es desde mi servicio entregar un arreglo JSON más o menos con esta estructura

    Celdas : [
         IndicadorCodigo : [
              {
                  CeldaKeyCodigo : valor,
                  CeldaKeyValor : valor
              },
              {
                  CeldaKeyCodigo : valor,
                  CeldaKeyValor : valor
              }
         ]
    ]

    Vale decir, agrupar los valores de la consulta de mi segundo SP por el valor que tenga IndicadorCodigo.

    La manera en que lo hice fue lo siguiente... Cree una clase llamada Celda con los campos anteriormente nombrados más una Lista de una clase llamada CeldaKeyVal con los cambos que me devuelve mi segundo SP.

    public class Celda
    {
        [DataMember]
        public int celda_id { get; set; }
        [DataMember]
        public int celda_indicador_codigo { get; set; }
        [DataMember]
        public int celda_indicador_tipo_codigo { get; set; }
        [DataMember]
        public List<CeldaKeyVal> valores_celda { get; set; }
    }
    
    
    public class CeldaKeyVal
    {
        [DataMember]
        public string celda_key_codigo { get; set; }
        [DataMember]
        public string celda_key_valor { get; set; }
    }

    Luego de tener esta estructura, recorro asi los resultados :

    public ListaCeldas GetCheckIn(int gsalid) 
    {
        SqlConnection conn = new SqlConnection(Db);
        List < Celda > celdas = new List < Celda > ();
        ListaCeldas listaCeldas = new ListaCeldas();
        try {
            SqlCommand cmd = new SqlCommand("MBL_SEL_CELDAS", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("gsalid", gsalid);
            conn.Open();
            cmd.ExecuteNonQuery();
            DataTable dtCelda = new DataTable();
            dtCelda.Load(cmd.ExecuteReader());
            foreach(DataRow dr in dtCelda.Rows) {
                Celda celda = new Celda();
                celda.celda_id = Convert.ToInt32(dr["CeldaId"]);
                celda.celda_indicador_codigo = Convert.ToString(dr["CeldaIndicadorCodigo"]);
                celda.celda_indicador_tipo = Convert.ToString(dr["CeldaIndicadorTipoCodigo"]);
                DataTable dtCeldasKey = new DataTable();
                SqlCommand cmd_celdas_key = Helper.GetCeldaValoresKey(celda.celda_id);
                dtCeldasKey.Load(cmd_celdas_key.ExecuteReader());
                List < CeldaKeyVal > listaCeldaKey = new List < CeldaKeyVal > ();
                foreach(DataRow drCeldasKey in dtCeldasKey.Rows) {
                    CeldaKeyVal celda_key_val = new CeldaKeyVal();
                    celda_key_val.celda_key_codigo = Convert.ToString(drCeldasKey["CeldaKeyCodigo"]);
                    celda_key_val.celda_key_valor = Convert.ToString(drCeldasKey["CeldaKeyValue"]);
                    listaCeldaKey.Add(celda_key_val);
                }
                celda.valores_celda = listaCeldaKey;
                celdas.Add(celda);
            }
            List < Celda > cl = celdas.OrderBy(c => c.celda_indicador_codigo).ToList();
            listaCeldas.celdas = cl;
            if (celdas.Count > 0) {
                listaCeldas.status = 1;
            }
        } catch (Exception e) {
            listaCeldas.status = 0;
        } finally {
            conn.Close();
        }
    
        return listaCeldas;
    }

    Esto funciona bien para mi pero no el orden que deseo, este es el JSON que recibo

    {
      "GetCheckInResult": {
        "celdas": [
          {
    
            "celda_id": 1,
            "celda_indicador_codigo": "I001",
            "celda_indicador_tipo": "T01",
            "valores_celda": [
              {
                "celda_key_codigo": "CODIGO",
                "celda_key_valor": "CHECK1"
              },
              {
                "celda_key_codigo": "IMAGEN",
                "celda_key_valor": "L76nD.jpg"
              },
              {
                "celda_key_codigo": "SUBTEXTO",
                "celda_key_valor": "prueba subtexto 1"
              },
              {
                "celda_key_codigo": "TEXTO",
                "celda_key_valor": "Prueba dominio 1"
              }
            ]
          },
          {
            "celda_id": 4,
            "celda_indicador_codigo": "I002",
            "celda_indicador_tipo": "T03",
            "valores_celda": [
              {
                "celda_key_codigo": "CODIGO",
                "celda_key_valor": "codigo"
              }
            ]
          },
          {
            "celda_id": 5,
            "celda_indicador_codigo": "I002",
            "celda_indicador_tipo": "T03",
            "valores_celda": [
              {
                "celda_key_codigo": "CODIGO",
                "celda_key_valor": "ssddsds"
              }
            ]
          },
          {
            "celda_id": 3,
            "celda_indicador_codigo": "I003",
            "celda_indicador_tipo": "T02",
            "valores_celda": [
              {
                "celda_key_codigo": "CODIGO",
                "celda_key_valor": "sdadsa"
              },
              {
                "celda_key_codigo": "IMAGEN",
                "celda_key_valor": "L76nD.jpg"
              },
              {
                "celda_key_codigo": "TEXTO",
                "celda_key_valor": "Texto 1"
              }
            ]
          }
        ],
        "status": 1
      }
    }

    Sé que el error esta en mi estructura de las clases pero no se me ocurre como armarlas para conseguir el formato que quiero conseguir.

    LO QUE ESPERO

    Obtener un arreglo de celdas y sus valores ordenamos por IndicadorCodigo

    Json esperado :

    {
      "GetCheckInResult": {
        "celdas": [
             "T01" : [
                {
                  "celda_key_codigo": "CODIGO",
                  "celda_key_valor": "CHECK1"
                },
                {
                  "celda_key_codigo": "IMAGEN",
                  "celda_key_valor": "L76nD.jpg"
                },
                {
                  "celda_key_codigo": "SUBTEXTO",
                  "celda_key_valor": "prueba subtexto 1"
                },
                {
                  "celda_key_codigo": "TEXTO",
                  "celda_key_valor": "Prueba dominio 1"
                }
            ],
            "T02" : [
                {
                  "celda_key_codigo": "CODIGO",
                  "celda_key_valor": "CHECK1"
                },
                {
                  "celda_key_codigo": "IMAGEN",
                  "celda_key_valor": "L76nD.jpg"
                },
                {
                  "celda_key_codigo": "SUBTEXTO",
                  "celda_key_valor": "prueba subtexto 1"
                },
                {
                  "celda_key_codigo": "TEXTO",
                  "celda_key_valor": "Prueba dominio 1"
                }
            ]
        ],
        "status": 1
      }
    }








    Nicolás Hernández Chile

    • Cambiado Laura Ceglz martes, 25 de octubre de 2016 14:24
    martes, 25 de octubre de 2016 14:01