Dapper结果为json(使用fastjson)

时间:2016-05-15 16:13:56

标签: c# .net json dapper fastjson

  

=====更新时间2016年8月20日=====

     

最新版本的fastjson现在可以正确处理Dictionary<string, ?>类型,我的问题现在已经解决了。

     

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

我正在使用fastjson序列化来自Dapper的查询结果,DB中的表具有如下数据:

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

当我

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

我希望结果是:

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

然而实际结果输出:

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

生成了许多看起来多余的键值对。

有没有办法获得正确的结果?

或者我应该切换到另一个JSON序列化程序?

==========更新==========

makubex88的回答表明我可以创建一个映射表的自定义类,并使用conn.Query<myClass>来获取正确的json,虽然它适用于这种情况,看起来我必须为每个表创建数百个类DB获得理想的json结果,这对我来说确实很累人。 (谢谢你:P)

任何替代解决方案都将受到高度赞赏!

2 个答案:

答案 0 :(得分:5)

我找到了一个处理它的解决方案(但它可能会失去一些效率),为实现这一点,我编写了自己的QueryEx方法,查询结果中的每一行都是一个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));
}

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

原因:fastJSON只能正确解析IDictionary接口,任何通用版本的IDictionary都会被解析为键值对列表

答案 1 :(得分:1)

尝试在JSON中为输出创建一个类,然后可以用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);