none
Serializar un string a Json RRS feed

  • Pregunta

  • Hola:

     Estoy tratando de generar un objeto Json como el siguiente:

     basándome en este ejemplo (dynamic column headers via aj)

    {
        "columns": [
            [ "Name" ],
            [ "Position" ],
            [ "Office" ],
            [ "Extn." ],
            [ "Start date" ],
            [ "Salary" ]
        ],
        "data": [
        [
          "Tiger Nixon",
          "System Architect",
          "Edinburgh",
          "5421",
          "2011/04/25",
          "$320,800"
        ],
        [
          "Garrett Winters",
          "Accountant",
          "Tokyo",
          "8422",
          "2011/07/25",
          "$170,750"
        ],
        [
          "Ashton Cox",
          "Junior Technical Author",
          "San Francisco",
          "1562",
          "2009/01/12",
          "$86,000"
        ],
        [
          "Cedric Kelly",
          "Senior Javascript Developer",
          "Edinburgh",
          "6224",
          "2012/03/29",
          "$433,060"
        ],
        [
          "Airi Satou",
          "Accountant",
          "Tokyo",
          "5407",
          "2008/11/28",
          "$162,700"
        ]
      ]
    }

     Desde mi controller a partir de un DataTable, en donde los nombres de las Columnas tienen que ir mapeadas al array "Columns" y el contenido de las celdas al array "data" para lograr este mapeo realizo lo siguiente:

            public string DtCoumns(DataTable table)
            {
                var jsonString = new StringBuilder();
                jsonString.Append("[");
                for (int j = 0; j < table.Columns.Count; j++)
                {
                    if (j < table.Columns.Count - 1 && j >= 0)
                        jsonString.Append("[\"" + table.Columns[j].ColumnName + "\"],");
                    else if(j == table.Columns.Count -1)
                        jsonString.Append("[\"" + table.Columns[j].ColumnName + "\"]");
                }
                jsonString.Append("]");
                return jsonString.ToString();
            }
    
            public string DtBody(DataTable table)
            {
                var jsonString = new StringBuilder();
                jsonString.Append("[");
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    if (i == 0)
                        jsonString.Append("[");
                    else
                        jsonString.Append(",[");
                    for (int j = 0; j < table.Columns.Count; j++)
                    {
    
                        if (j == 1)
                        {
                            jsonString.Append("\"" + table.Rows[i][j] + "\"");
                        }
                        else if (j < table.Columns.Count - 1 && j > 1)
                        {
                            jsonString.Append(", \"" + table.Rows[i][j] + "\"");
                        }
                        else if (j == table.Columns.Count - 1)
                        {
                            jsonString.Append(", \"" + table.Rows[i][j] + "\"]");
                        }
                    }
    
                }
                jsonString.Append("]");
                return jsonString.ToString();
            }

     Y este es mi controller:

    public JsonResult ControllerName(List<Parameters> params)
    {
            DataTable dtTable = //mi origen de datos        
            return Json(new { columns = DtCoumns(dtTable), data = DtBody(dtTable) }, JsonRequestBehavior.AllowGet);
    }

      Trato de recibir aqui el json:

    $.ajax({
            url: '.....',
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify({ 'params': params }),
            type: "post",
            dataType: 'json',
            success: function (xx) {           
                var tableHeaders;
                $.each(xx.columns, function (i, val) {
                    tableHeaders += "<th>" + val + "</th>";
                });
    
                $("#tableDiv").empty();
                $("#tableDiv").append('<table id="displayTable" class="display" cellspacing="0" width="100%"><thead class="ColorHeaderTable"><tr>' + tableHeaders + '</tr></thead></table>');
               
                $('#displayTable').dataTable(xx);
            }  
    });

     Pero recibo este mensaje de error:

    TypeError: invalid 'in' operand a

     He realizado una prueba poniendo la estructura que deseo obtener como hardcode en un variable de javascript en mi vista y me funciona perfectamente, pero cuando envió el json desde el controller obtengo ese error.

    ¿Alguna idea para solucionar este detalles?



    Saludos desde Monterrey, Nuevo León, México!!!

    miércoles, 15 de marzo de 2017 15:30

Todas las respuestas

  • hola

    Porque ese codigo tan raro? no se convierte un datatable a json parseando este de esa forma

    Si lo necesitas convierte el datatable a una clase o lista y luego serializa a json usando json.net

    la idea es no generar el json como string, ademas esta raro el tema de las "columns", no ser

     "columns": [
            "Name",
            "Position",
            "Office",
            "Extn.",
            "Start date",
            "Salary"
        ],

    porque sino estas generando un array dentro de otro

    es mas estas con asp.net mvc, ni siquiera necesitas json.net, solo asignas la clase que mapea con la estructura de json y lo conviertr directo, para ayudarte usa

    http://json2csharp.com/

    Nota: elimina esos metodos DtCoumns() y  DtBody() y usa clases, listas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina



    jueves, 16 de marzo de 2017 3:56