5

===== 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)

任何替代解决方案将不胜感激!

4

2 回答 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 都会被解析为 Key-Value 对列表

于 2016-05-16T02:57:16.367 回答
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);
于 2016-05-15T16:31:35.000 回答