Dapper resultado a json (usando fastjson)

.net c# dapper fastjson json

Pregunta

===== ACTUALIZADO 20/8/2016 =====

La última versión de fastjson ahora puede manejar correctamente el tipo Dictionary<string, ?> , mi problema está resuelto ahora.

==========================

Estoy usando fastjson para serializar el resultado de la consulta de Dapper, la tabla en DB tiene datos como este:

id | name | price
1  | x    | 100
2  | y    | 200
....

Y cuando yo

using Dapper;
using fastJSON;
// ....
JSON.Parameters.KVStyleStringDictionary = false;
// ....
result = JSON.toJSON(conn.Query("SELECT * FROM tableX"));

Quiero que el resultado sea:

[{"id":1,"name":"x","price":100},{"id":2,"name":"y","price":200},...]

Sin embargo, los resultados reales son:

[[{"Key":"id","Value":1},{"Key":"name","Value":"x"},{"Key":"price","Value":100}],
[{"Key":"id","Value":2},{"Key":"name","Value":"y"},{"Key":"price","Value":200}]...]

Se generan muchos pares clave-valor que parecen redundantes.

¿Hay alguna manera de obtener el resultado correcto?

¿O debería cambiar a otro serializador JSON?

========== ACTUALIZADO ==========

La respuesta de makubex88 indica que puedo crear una clase personalizada mapeando la tabla y usar conn.Query<myClass> para obtener el json correcto, aunque funciona para este escenario, parece que tengo que crear cientos de clases para cada tabla en DB para obtener el resultado ideal json, que de hecho es un trabajo agotador para mí. (Gracias de cualquier manera: P)

¡Cualquier solución alternativa sería muy apreciada!

Respuesta aceptada

Encontré una solución para manejarlo (sin embargo, puede perder algo de eficiencia), para lograr esto, escribo mi propio método QueryEx , cada fila en el resultado de la consulta es un objeto IDictionary:

public IEnumerable<IDictionary> QueryEx(IDbConnection conn, string sql, object argSet = null) {
    var result = conn.Query(sql, argSet) as IEnumerable<IDictionary<string, object>>;
    return result.Select(r => r.Distinct().ToDictionary(d => d.Key, d => d.Value));
}

Y

result = JSON.toJSON(conn.QueryEx("SELECT * FROM tableX"));
// output: [{"id":1,"name":"x","price":100},{"id":2,"name":"y","price":200},...]

razón: fastJSON solo puede analizar la interfaz de IDictionary correctamente, cualquier versión genérica de IDictionary se analizará como listas de pares clave-valor


Respuesta popular

Intenta crear una clase para tu salida en JSON, luego puedes serializarla en JSON.

//your class
    public class Item
    {
        int ID;
        public string Name;
        public double Price;
    }
//code:
    List<Item> = conn.Query<Item>("SELECT * FROM tableX").AsList();
    var result = Json(Item, JsonRequestBehavior.AllowGet);


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué