Dapper结果转为Json(使用FastJson)

5

===== 更新于 2016 年 8 月 20 日 =====

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

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

我正在使用 fastjson 序列化 Dapper 查询结果,数据库中的表格数据如下:

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"));

I want the result to be:

[{"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,虽然在这种情况下它可以工作,但似乎我必须为数据库中的每个表创建数百个类才能获得理想的JSON结果,这对我来说确实是一项繁琐的工作。(无论如何感谢)

非常感谢任何替代方案!

2个回答

6
我找到了一个解决方案来处理它(尽管可能会失去一些效率),为了实现这个目标,我编写了自己的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
尝试为您的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);

3
我加入了缺失的<Item>;我也将ToList()更改为dapper的AsList() - 在这种情况下可以避免分配/复制。 - Marc Gravell
1
尽管它有效,但我似乎必须为数据库中的每个表创建类(数百个表)才能获得理想的JSON结果,这对我来说确实是繁琐的工作。@makubex88 - ineztia
{btsdaf} - StuartQ
1
{btsdaf} - Jeric Cruz
2
@StuartQ yes, I would say so - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接