【问题标题】:Reducing the byte count of JsonResult messages in ASP.NET MVC减少 ASP.NET MVC 中 JsonResult 消息的字节数
【发布时间】:2011-05-06 23:38:53
【问题描述】:

使用JsonResult 编码的操作结果在序列化中似乎过于冗长。例如:

{"foo":"bar","list":["a","b"],"map":{"a":1,"b":2,"c":3}}

JavaScript 似乎对这个较短的版本非常满意:

{foo:"bar",list:["a","b"],map:{a:1,b:2,c:3}}

所以这个问题有两个方面:

  1. 假设我所有的标签都是有效的 JavaScript 标识符,是否有理由认为前者更好?
  2. 我可以强制 ASP.NET MVC 框架使用这种更短的语法对我的消息进行编码吗?

我正在编写一个非常重 AJAX 的应用程序,并计算出我可以节省 15% 到 20% 的消息大小。在许多情况下,是否将响应放入单个 TCP 数据包中会有所不同。即使不考虑性能,减少我每月的带宽费用也是一个福音。

编辑

正如贾斯汀指出的那样,根据 JSON 标准,引号是必需的,但我不需要它们在浏览器中用于纯 JavaScript 使用。我可以强制 .NET Web 框架以比编写自己的 JSON 序列化程序更简单的方式删除引号吗?

【问题讨论】:

  • 在向ASMX和WCF服务发布数据时,引号是必须的,不能用单引号代替,否则会看到服务抛出异常。不过,我找不到任何 JSON 标准说引号是必要的,至少对于 Javascript 来说不是。
  • 您的计算是否考虑了 http 流的压缩?我不确定你是否真的会节省 15-20%,但这只是一种预感。
  • @Ryan。好点,但是如果我的消息很小(1.5kB),那么压缩实际上可能会增加它们的大小。不过,我一定会考虑将其作为一种选择,干杯。

标签: .net asp.net-mvc json serialization jsonresult


【解决方案1】:

在视频"JavaScript - The Good Parts" 中的 -30:20,Douglas Crockford 指出,客户端和服务器之间发送的第一条 JSON 消息失败,因为他们使用的字段名称之一是“do”,这是一个保留字在 JavaScript 中。他解释说不一定非要这样(解释器可以根据上下文进行区分),但这是从匆忙开发的语言中溜进标准的众多怪癖之一。

因此,字段名称需要引号。当然,应该可以保留保留术语列表并仅将其括在引号中。

【讨论】:

    【解决方案2】:

    还有另一个线程在谈论引号:

    JSON syntax for property names

    基本要点是不使用引号是有效的 javascript,但不是有效的 JSON。


    至于修改您的 JSON 以不包含属性的引号 - 我不太确定这是一个好主意。如果您选择为外部 API 打开 JSON 调用,谁知道无效格式会出现什么问题。

    但如果你想在这里继续,我认为你最好的选择是下载和修改 JSON.NET 开源库:

    http://json.codeplex.com/

    在他们的文档中,有一篇关于减少 JSON 占用空间大小的具体文章,尽管他们没有提到删除引号:

    http://james.newtonking.com/projects/json/help/ReducingSerializedJSONSize.html

    下载此代码并修改 JSONTextWriter 类后,您可以在 MVC 中创建使用此序列化程序的自定义 ActionResult,而不是 JsonResult 类中默认使用的 System.Web.Script.Serialization.JavaScriptSerializer 类。在 MVC Contrib 项目中,有一些非常棒的示例可以使用其他数据类型进行此操作:

    http://mvccontrib.codeplex.com/

    希望这会有所帮助。

    【讨论】:

    • 感谢您的链接。现在,至于问题的第二部分(和真正的内容),我可以强制 .NET Web 框架以比编写自己的 JSON 序列化器更简单的方式删除引号吗?
    猜你喜欢
    • 2014-07-03
    • 2012-12-09
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2011-08-07
    • 2017-12-07
    相关资源
    最近更新 更多