2016-05-15 60 views
4

=====已更新2016年8月20日=====小巧玲珑的结果,以JSON(使用FASTJSON)

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

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

我使用FASTJSON序列化从查询结果短小精悍,在数据库表中有这样的数据:

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 ,尽管它适用于这种情况,但它看起来像我必须为数据库中的每个表创建数百个类以获得理想的json结果,这确实对我来说很累。 (谢谢任何方式:P)

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

回答

4

我找到了一个解决方案来处理它(但是它可能会失去一些效率),来实现这一点,我写我自己的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的任何仿制药会被解析为键值对列表

+0

真棒解决方法:) – Prashanth

2

尝试在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

我加了缺失的'';我也将'ToList()'改成了Dapper的'AsList()' - 避免了在这种情况下的分配/复制 –

+1

虽然它有效,但它看起来像我必须为DB中的每个表创建类(数百个表) json的结果,这对我来说的确是累人的工作。 @ makubex88 – ineztia

+0

@MarcGravell感谢你的信息。 –