Dapper 结果达到 json(使用 fastjson)
Dapper result to json (using fastjson)
===== UPDATED 8/20/2016 =====
latest version of fastjson can now handle Dictionary<string, ?>
type correctly, my problem is solved now.
=============================
我正在使用fastjson序列化来自Dapper的查询结果,DB中的table有这样的数据:
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 的回答表明我可以创建自定义 class 映射 table 并使用 conn.Query<myClass>
获得正确的 json,尽管它适用于这种情况,看起来我必须为数据库中的每个 table 创建数百个 class 才能获得理想的 json 结果,这对我来说确实很累。 (感谢任何way:P)
任何替代解决方案将不胜感激!
尝试为 JSON 中的输出创建一个 class,然后您可以在 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);
我找到了一个解决方案来处理它(但是它可能会降低一些效率),为了实现这个,我写了我自己的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 都会被解析为键值对列表
===== UPDATED 8/20/2016 =====
latest version of fastjson can now handle
Dictionary<string, ?>
type correctly, my problem is solved now.=============================
我正在使用fastjson序列化来自Dapper的查询结果,DB中的table有这样的数据:
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 的回答表明我可以创建自定义 class 映射 table 并使用 conn.Query<myClass>
获得正确的 json,尽管它适用于这种情况,看起来我必须为数据库中的每个 table 创建数百个 class 才能获得理想的 json 结果,这对我来说确实很累。 (感谢任何way:P)
任何替代解决方案将不胜感激!
尝试为 JSON 中的输出创建一个 class,然后您可以在 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);
我找到了一个解决方案来处理它(但是它可能会降低一些效率),为了实现这个,我写了我自己的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 都会被解析为键值对列表