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.7 MB。我认为如果 JSON 中的 HTML 标记不是全部 unicode 编码的,这可以显着减少。根据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 响应。我强烈推荐为此使用 ServiceStack.Text(在 NuGet 上),因为它速度极快,易于启动和运行,并且支持最常见的场景。Microsoft 内置产品的另一个流行替代品是 NewtonSoft 的 JsonSerializer(也在 NuGet 上)。

这种方法的好处是您可以更好地控制结果的呈现方式。如果您有大量数据要发送,那么拥有一个快速的序列化器会产生很大的不同。

也就是说,你真的应该只使用 JSON 来通过网络发送数据(而不是标记)。诸如敲除之类的框架使得对从服务器检索到的 JSON 数据进行客户端渲染变得非常容易。朝这个方向发展应该是您的长期目标,但使用自定义序列化程序对这两种解决方案都有好处。

于 2012-12-12T22:33:44.020 回答