关于JSON在JavaScript中的定位

Posted 亚美妈妈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于JSON在JavaScript中的定位相关的知识,希望对你有一定的参考价值。

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 关于JSON在JavaScript中的定位  

根据维基百科的文章JSON

JSON是基于javascript脚本语言的一部分
所有JSON格式的文本也是合法的JavaScript代码
JSON是JavaScript的子集

这些年我们都一直在说"JSON是JavaScript的一个子集".然而事实却不是这样的.看下面的代码,完全看不出有什么问题,然而错误却不可避免,不是所有的JSON格式的文本都是合法的JavaScript代码:

{"JSON":"ro
cks!"}

复制上面的代码,并将其粘贴到Firebug或Web Inspector中(为了避免JavaScript语法歧义,需要用括号括起来)

关于JSON在JavaScript中的定位

等等,看看发生了什么,Uncaught SyntaxError: Invalid or unexpected token? 这是什么情况,只是一个非常常见的对象字符串,怎么可能语法错误呢?

尝试把代码用一个JSON解析器解析一下,没有任何问题.

当然,这不仅仅是一个常规的对象字符串,在"ro"和"cks"之间有一个小小的U+2028的Unicode字符,你的浏览器可能并没有显示什么,因为它仅仅是个空格:LINE SEPARATOR,不过它依然在那里.如果你用U+2029字符取代它,你还是会遇到这个问题.

JSON + U+2028 = ☺

根据JSON规范,你可以安全地在任何字符串中使用此字符。它不是一个引号,也不是一个反斜杠,也不是一个控制字符。它只是一个奇怪的Unicode空格字符:

JavaScript + U+2028 = ☹

另一方面,ECMA-262(JavaScript标准)定义了一些不同的字符串:根据 7.8.4 String Literals,,一个字符串可以包含任何东西,只要它不是一个引号,一个反斜线或一个行终止符.

那么,什么事行终止符呢? 让我们看一下7.3 Line Terminators:

下面的字符被认为是行终止符:

  • \u000A - Line Feed

  • \u000D - Carriage Return

  • \u2028 - Line separator

  • \u2029 - Paragraph separator

然而,JavaScript里没有字符串可以包括U+2028和U+2029字符.

所以呢?

正因为这两个不可见的Unicode字符,JSON便不是JavaScript的一个子集了.就差了这么一点点.

在大多数应用程序中,您不会注意到此问题。首先,行分隔符和段落分隔符没有被广泛使用。其次,任何正确的JSON解析器在解析它都不会有问题。

但是,当您处理JSONP时,他就会出现问题了:你将被迫在浏览器中使用JavaScript解析器。如果你发送的数据已经输入了,那么一个小小的U + 2028或U + 2029字符可能会潜入并破坏你漂亮的跨域API。

怎么解决?

幸运的是,解决方案很简单:如果我们查看JSON规范,我们看到U + 2028或U + 2029只能发生在一个字符串中。因此, 如果我们需要发送一些JSONP,我们就可以用\u2028和\u2029(转义序列)替换每个U+2028和U+2029字符。

它已经在 fixed in Rack::JSONP 中修复,我鼓励所有使用了JSONP的框架和库都这样做,它仅仅是大多数语言的单向补丁,结果依然是100%有效的JSON.


以上是关于关于JSON在JavaScript中的定位的主要内容,如果未能解决你的问题,请参考以下文章

求关于java中无key的json 解析

javascript中的java JSON对象

请教,百度IP定位API返回的JSON,用javascript怎么获取返回值?

JSON中的安全问题

json字符串在javascript和java代码中的表示方式

Java中net.sf.json包关于JSON与对象互转的坑