¿Cuál es la mejor manera de serializar jSON una tabla de datos .NET en WCF?

Resuelto rhyno asked hace 11 años • 4 respuestas

Cuando configuro WCF para usar la serialización jSON e incluyo un DataTable en uno de mis DataContracts, serializa el DataTable en XML antes de serializar todo el DataContract en jSON. Quiero que DataTable se serialice como jSON, no como XML.

Mis preguntas son:

  1. ¿Por qué serializa primero el DataTable a XML?
  2. ¿Cómo puedo hacer que se serialice en jSON?
rhyno avatar Jul 29 '13 22:07 rhyno
Aceptado
  1. DataTable es una construcción .NET pura que no se puede representar (fácilmente) sin pérdidas mediante JSON. Las DataTables contienen mucha información adicional que JSON no puede almacenar: claves primarias, autoincs, permitir valores nulos, títulos, tipos de datos, índices, etc. La serialización a XML/Binario es la única forma en que .NET puede serializar una DataTable de forma nativa. Esta tabla de datos serializada XML luego se serializa a JSON.

  2. Utilice JSON.NET o FastJSON para convertir un DataTable en una versión sencilla y limpia compatible con JSON del DataTable, que puede ser consumida por cualquier cliente JSON, no solo por clientes .NET WCF. Perderá todas las propiedades personalizadas de DataTable mencionadas en (1) arriba y solo obtendrá el par JSON nombre/valor del campo. El almacenamiento de esta manera es ineficiente debido a la duplicación de nombres de campos en cada fila.

No utilice DataTable en su DataContract. Si desea los beneficios de un DataTable y sus clientes siempre serán .NET, serialice el DataTable en una matriz de bytes mediante serialización binaria y luego, opcionalmente, comprima el flujo de bytes serializado resultante. Exponga una matriz de bytes en su DataContract. Esto le brindará una versión eficiente y sin pérdidas de DataTable en el lado del cliente (después de la descompresión y la deserialización binaria), no una versión JSON diluida de DataTable (como la que ofrece (2))...

Keith Blows avatar Jul 29 '2013 18:07 Keith Blows

Prueba esto:

public string ConvertDataTabletoString(System.Data.DataTable dt)
{
    System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
    Dictionary<string, object> row;
    foreach (System.Data.DataRow dr in dt.Rows)
    {
        row = new Dictionary<string, object>();
        foreach (System.Data.DataColumn col in dt.Columns)
        {
            row.Add(col.ColumnName, dr[col]);
        }
        rows.Add(row);
    }
    return serializer.Serialize(rows);
}
MUHAMMED IQBAL PA avatar Mar 07 '2015 11:03 MUHAMMED IQBAL PA

Tuve el mismo problema, mi servicio wcf no formateaba el json correctamente al convertirlo de Dataset a Json. Lo hice funcionar usando la siguiente solución:

using System.ServiceModel.Channels;
using System.ServiceModel.Web;

dsData es mi conjunto de datos

string json = Newtonsoft.Json.JsonConvert.SerializeObject(dsData);
return WebOperationContext.Current.CreateTextResponse(json, "application/json;charset=utf-8", System.Text.Encoding.UTF8);

y "Mensaje" será el tipo de devolución.

yoshiiiiiiii avatar Dec 24 '2015 04:12 yoshiiiiiiii

Según el gráfico de su página de inicio, Json.NET es realmente su única opción: puede obtenerlo rápidamente desde NuGet . Afortunadamente es una gran biblioteca y muy fácil de usar.

string json = JsonConvert.SerializeObject(myDataSet, new DataSetConverter());

Tenga en cuenta que Rich Strahl tiene una excelente publicación con más detalles y también incluye algunos trabajos personalizados que realizó para usar JavaScriptSerializercon convertidores personalizados (bastante extensos) a modo de comparación.

ladenedge avatar Jul 29 '2013 16:07 ladenedge