0

使用编码的动作结果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 序列化程序更简单的方式删除引号吗?

4

2 回答 2

1

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

属性名称的 JSON 语法

基本要点是不使用引号是有效的 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/

希望这可以帮助。

于 2010-11-09T04:01:57.157 回答
1

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

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

于 2010-11-24T00:47:11.410 回答