1

次のようなMVCアクションからJSON構造を返しています。

[HttpPost]
public ActionResult GetStudents(string name) 
{   
    //
    // Filter list of students...
    //

    return Json(new {
        aaData = students.ToList().Select(s => new [] {
            String.Format(@"<span style='display:none;'>{0}</span>{1}", s.Id, s.StudentNumber),
            String.Format(@"<a href='../../Student/Details/{0}'>{1}</a>", s.Id, s.FullName),
            String.Format(@"<a href='../../Student/Edit/{0}'>Edit</a>", s.Id)
        })
    }, JsonRequestBehavior.DenyGet);
}

結果のJSONは次のようになります。

{"aaData":
    [
        ["\u003cspan style=\u0027display:none;\u0027\u003e3\u003c/span\u003e009165",
         "\u003ca href=\u0027../../Student/Details/3\u0027\u003eJohn Smith\u003c/a\u003e",
         "\u003ca href=\u0027../../Student/Edit/3\u0027\u003eEdit\u003c/a\u003e"],

        ... Lots more ...
    ]
}

これは問題なく動作します。しかし、完全なJSONは約1.7MBになります。JSON内のHTMLタグがすべてユニコードでエンコードされていなければ、これを大幅に削減できると思います。JSON仕様によると、これらをエンコードする必要はないようです。

any-Unicode-character-except-"-or-\-or-control-character

.NETがこの方法でJSONを書き出さないようにする方法はありますか、または送信する必要のあるデータの量を減らす他の方法はありますか?

4

1 に答える 1

2

最初に行うことは、JSONシリアライザーを置き換えることです。これを作成するために、独自の結果クラスとコントローラー拡張メソッドを作成します。

次のようなもの:

public class FastJsonResult : ActionResult // or maybe derive from JsonResult
{
    private object model;

    public FastJsonResult(object model) 
    {
        this.model = model;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        // code to set content type and write serialized response
    }
}

そして、コントローラー拡張メソッド:

public static class JsonControllerExtensions
{
     public static ActionResult FastJson(this Controller controller, object model)
     {
         return new FastJsonResult(model);
     }
}

次のように独自のシリアル化コードを使用できるようにします。

// at the end of your controller method:
return new FastJson(model);

JSON応答を適切にフォーマットするシリアライザーをプラグインする必要があります。これには(NuGetで)ServiceStack.Textを使用することを強くお勧めします。これは、非常に高速で、起動と実行が簡単で、最も一般的なシナリオをサポートしているためです。Microsoftの組み込み製品のもう1つの人気のある代替手段は、NewtonSoftのJsonSerializer(これもNuGetにあります)です。

このアプローチの利点は、結果のレンダリング方法をより適切に制御できることです。送信するデータが大量にある場合は、高速シリアライザーを使用するとかなりの違いが生じる可能性があります。

とは言うものの、実際には、(マークアップではなく)ネットワークを介してデータを送信するためにJSONのみを使用する必要があります。ノックアウトなどのフレームワークを使用すると、サーバーから取得したJSONデータのクライアント側でのレンダリングを非常に簡単に行うことができます。この方向に進むことは長期的な目標であるはずですが、カスタムシリアライザーを使用することはどちらのソリューションにもメリットがあります。

于 2012-12-12T22:33:44.020 に答える