1

Newtonsoft.JSON を使用して DataTable を JSON に変換しようとしていますが、出力が ExtJS グリッドとチャートが期待するものではないことがわかりました。

私のコードは

string output = JsonConvert.SerializeObject(dt, Formatting.Indented,
                            new JsonSerializerSettings
                            {
                                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                            });

これはJson文字列を次のように返します

"[{\"DAYDATE\":\"2012-05-22T00:15:00\",\"SERIES1\":3.65}]"

「\」と開始および終了の二重引用符を削除すると、ExtJS で正常に動作します。

また、日付形式をよりJSONに変更しようとしました

string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());

結果は

"[{\"DAYDATE\":new Date(1337642100000),\"SERIES1\":3.65}]"

まだ運がない

4

1 に答える 1

2

JSON が二重にシリアル化されているようです。完全なコントローラー コードは表示されませんでしたが、次のようなことを行っていると思います。

    public ActionResult GetDataTable()
    {
        // (... code to build data table omitted for brevity ...)

        // Serialize data table using Json.Net to avoid circular reference error
        string output = JsonConvert.SerializeObject(dt,
            new JsonSerializerSettings
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
                Formatting = Formatting.Indented
            });

        return Json(output);
    }

このJson()メソッドはシリアライゼーションも呼び出します。通常、MVC コントローラーでは、Json()メソッドを使用して戻りオブジェクトをシリアル化し、Json.Net を個別に使用しません。ここで Json.Net を使用して、データ テーブルをシリアル化しようとしたときに循環参照が原因で発生する例外を回避しようとしていることがわかります。手動でシリアル化する場合は、再度シリアル化されないようにデータを返す必要があります。Content()代わりにメソッドを使用してこれを行うことができます。次のようにしてみてください。

public ActionResult GetDataTable()
{
    // Build data table
    DataTable dt = new DataTable();
    dt.Columns.Add("DAYDATE", typeof(DateTime));
    dt.Columns.Add("SERIES1", typeof(double));
    dt.Rows.Add(new DateTime(2012, 5, 22, 0, 15, 0), 3.65);

    // Serialize data table using Json.Net to avoid circular reference error
    string output = JsonConvert.SerializeObject(dt,
        new JsonSerializerSettings
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
            Formatting = Formatting.Indented
        });

    // Output is already serialized; return it as is (with the appropriate media type)
    return Content(output, "application/json");
}

私のテストでは、上記は次の出力を生成します。これはあなたが探しているものだと思います:

[ { "DAYDATE": "2012-05-22T00:15:00", "SERIES1": 3.65 } ]
于 2013-10-03T13:20:49.480 に答える