ACTUALIZACIÓN

Me lo imaginé. Echa un vistazo a mi respuesta a continuación.


Estoy tratando de crear una cadena JSON que representa una fila de una tabla de base de datos para volver en una respuesta HTTP. Parece que Json.NET sería una buena herramienta a utilizar. Sin embargo, no estoy seguro de cómo hacer construir la cadena JSON mientras estoy leyendo de la base de datos.

El problema está marcada por el odioso comentarios /******** ********/

//connect to DB
theSqlConnection.Open(); //open the connection

SqlDataReader reader = sqlCommand.ExecuteReader();
if (reader.HasRows) {

    while(reader.Read()) {

        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);

        using (JsonWriter jsonWriter = new JsonTextWriter(sw)) {

            //read columns from the current row and build this JsonWriter
            jsonWriter.WriteStartObject();
            jsonWriter.WritePropertyName("FirstName");

            //I need to read the value from the database
/******** I can't just say reader[i] to get the ith column. How would I loop here to get all columns? ********/
            jsonWriter.WriteValue(... ? ...);
            jsonWriter.WritePropertyName("LastName");
            jsonWriter.WriteValue(... ? ...);
            jsonWriter.WritePropertyName("Email");
            jsonWriter.WriteValue(... ? ...);

            //etc...
            jsonWriter.WriteEndObject();
        }
    }
}

El problema es que no sé cómo leer cada columna de la fila de la SqlReader tal que yo pueda llamar WriteValue y darle la información correcta y adjuntarlo para el correcto nombre de la columna. Así que si una fila se parece a esto…

| FirstName | LastName | Email |

… ¿cómo puedo crear un JsonWriter para cada fila que contiene todos los nombres de columna de la fila y los valores correspondientes en cada columna y, a continuación, utilizar ese JsonWriter para construir una cadena JSON que está listo para regresar a través de una Respuesta HTTP?

Déjame saber si tengo que aclarar nada.

OriginalEl autor Hristo | 2011-04-05

4 Comentarios

  1. 20

    Mi versión:

    Esto no utilizar DataSchema y envuelve también los resultados en una matriz, en lugar de utilizar un escritor por fila.

    SqlDataReader rdr = cmd.ExecuteReader();
    
    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);    
    
    using (JsonWriter jsonWriter = new JsonTextWriter(sw)) 
    {    
        jsonWriter.WriteStartArray();
    
        while (rdr.Read())
        {
            jsonWriter.WriteStartObject();
    
            int fields = rdr.FieldCount;
    
            for (int i = 0; i < fields; i++)
            { 
                jsonWriter.WritePropertyName(rdr.GetName(i));
                jsonWriter.WriteValue(rdr[i]);
            }
    
            jsonWriter.WriteEndObject();
        }
    
        jsonWriter.WriteEndArray();
    }
    Muy útil! Muchas gracias!

    OriginalEl autor ProVega

  2. 6

    EDITADO POR EJEMPLO ESPECÍFICO:

    theSqlConnection.Open();
    
    SqlDataReader reader = sqlCommand.ExecuteReader();
    DataTable schemaTable = reader.GetSchemaTable();
    
    foreach (DataRow row in schemaTable.Rows)
    {
        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
    
        using (JsonWriter jsonWriter = new JsonTextWriter(sw)) 
        {    
            jsonWriter.WriteStartObject();
    
            foreach (DataColumn column in schemaTable.Columns)
            {
                jsonWriter.WritePropertyName(column.ColumnName);
                jsonWriter.WriteValue(row[column]);
            }
    
            jsonWriter.WriteEndObject();
        }
    }
    
    theSqlConnection.Close();
    … ejemplo…?
    Editado respuesta a mostrar ejemplo de msdn. También puedes ver otras formas de hacer algo similar en esa página.
    impresionante! Voy a poner esto juntos. Una vez que tengo mi upvoting privilegios de nuevo, te voy a dar un +1
    Me dejó editar la respuesta, de nuevo para usted. Yo nunca he usado Json.NET antes, pero voy a editar lo que me gustaría probar.
    No hay problema, que me haga saber … me interesaría saber también! La buena suerte.

    OriginalEl autor Code Maverick

  3. 4

    Tengo! Aquí está el C#…

    //... SQL connection and command set up, only querying 1 row from the table
    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    JsonWriter jsonWriter = new JsonTextWriter(sw);
    
    try {
    
        theSqlConnection.Open(); //open the connection
    
        //read the row from the table
        SqlDataReader reader = sqlCommand.ExecuteReader();
        reader.Read();
    
        int fieldcount = reader.FieldCount; //count how many columns are in the row
        object[] values = new object[fieldcount]; //storage for column values
        reader.GetValues(values); //extract the values in each column
    
        jsonWriter.WriteStartObject();
        for (int index = 0; index < fieldcount; index++) { //iterate through all columns
    
            jsonWriter.WritePropertyName(reader.GetName(index)); //column name
            jsonWriter.WriteValue(values[index]); //value in column
    
        }
        jsonWriter.WriteEndObject();
    
        reader.Close();
    
    } catch (SqlException sqlException) { //exception
        context.Response.ContentType = "text/plain";
        context.Response.Write("Connection Exception: ");
        context.Response.Write(sqlException.ToString() + "\n");
    } finally {
        theSqlConnection.Close(); //close the connection
    }
    //END of method
    //the above method returns sb and another uses it to return as HTTP Response...
    StringBuilder theTicket = getInfo(context, ticketID);
    context.Response.ContentType = "application/json";
    context.Response.Write(theTicket);

    … por lo que el StringBuilder sb variable es el objeto JSON que representa la fila quería consultar. Aquí es el JavaScript…

    $.ajax({
        type: 'GET',
        url: 'Preview.ashx',
        data: 'ticketID=' + ticketID,
        dataType: "json",
        success: function (data) {
    
            //data is the JSON object the server spits out
            //do stuff with the data
        }
    });

    Gracias a Scott por su respuesta, que me inspiró para llegar a mi solución.

    Hristo

    Esta respuesta, combinado con el de la stackoverflow.com/a/14818354/2079606 se ha resuelto mi problema! Muchas gracias.
    Si había varias filas en su datareader, ¿se dará una serie de objetos en su respuesta en JSON? es decir, [{ "row1-col1":"dataABC", "row1col2":"dataDEF" }, { "row2col1": "more data", "row2col2": "even more" }] – estoy un poco sorprendido de Microsoft no ha proporcionado un método integrado para este .NET 4.5+…

    OriginalEl autor Hristo

  4. 0

    Me hizo el siguiente método en el que se convierte cualquier objeto DataReader para JSON, pero sólo para una sola profundidad de serialización:

    debe pasar el lector, y los nombres de columna como una matriz de cadena, por ejemplo:

    String [] columns = {"CustomerID", "CustomerName", "CustomerDOB"};

    a continuación, llame al método

    public static String json_encode(IDataReader reader, String[] columns)
        {
            int length = columns.Length;
    
            String res = "{";
    
            while (reader.Read())
            {
                res += "{";
    
                for (int i = 0; i < length; i++)
                {
                    res += "\"" + columns[i] + "\":\"" + reader[columns[i]].ToString() + "\"";
    
                    if (i < length - 1)
                        res += ",";
                }
    
                res += "}";
            }
    
            res += "}";
    
            return res;
        }
    Debe utilizar un StringBuilder objeto o algo por el estilo, de lo contrario se está reconstruyendo toda la Cadena y copiar una y otra

    OriginalEl autor Amjad Abu Saa

Dejar respuesta

Please enter your comment!
Please enter your name here