¿Cuál es la mejor manera de serializar jSON una tabla de datos .NET en WCF?
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:
- ¿Por qué serializa primero el DataTable a XML?
- ¿Cómo puedo hacer que se serialice en jSON?
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.
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))...
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);
}
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.
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 JavaScriptSerializer
con convertidores personalizados (bastante extensos) a modo de comparación.