=====更新2016年8月20日===== 最新版本的correctly现在可以正确处理
Dictionary<string, ?>类型,我的问题现在解决了。 =============================
我使用query来序列化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 88的回答表明,我可以创建一个定制的类来映射表,并使用conn.Query<myClass>来获得正确的json,尽管它适用于这个场景,但看起来我必须为DB中的每个表创建数百个类才能获得理想的json结果,这对我来说确实很累人。(谢谢任何方式:P)
任何替代解决方案都将是非常感谢的!
发布于 2016-05-16 02:57:16
我找到了一个解决方案来处理它(尽管它可能会失去一些效率),为此,我编写了我自己的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的泛型版本都将被解析为键值对列表。
发布于 2016-05-15 16:31:35
尝试用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);https://stackoverflow.com/questions/37240633
复制相似问题