5

===== 2016 年 8 月 20 日更新 =====

最新バージョンの fastjson はDictionary<string, ?>タイプを正しく処理できるようになりました。私の問題は解決しました。

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

Dapper からのクエリ結果をシリアル化するために fastjson を使用しています。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 を取得するために使用できることを示していますが、このシナリオでは機能しますが、理想的な json の結果を得るには、DB 内のすべてのテーブルに対して何百ものクラスを作成する必要があるようです。私にとっては確かに疲れる仕事です。(とにかくありがとう: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 の汎用バージョンは、キーと値のペアのリストとして解析されます。

于 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 に答える