2016-05-15 46 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感謝你的信息。 –