关于JSON在JavaScript中的定位
Posted 亚美妈妈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于JSON在JavaScript中的定位相关的知识,希望对你有一定的参考价值。
根据维基百科的文章JSON
JSON是基于javascript脚本语言的一部分
所有JSON格式的文本也是合法的JavaScript代码
JSON是JavaScript的子集
这些年我们都一直在说"JSON是JavaScript的一个子集".然而事实却不是这样的.看下面的代码,完全看不出有什么问题,然而错误却不可避免,不是所有的JSON格式的文本都是合法的JavaScript代码:
{"JSON":"ro cks!"}
复制上面的代码,并将其粘贴到Firebug或Web Inspector中(为了避免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中的定位的主要内容,如果未能解决你的问题,请参考以下文章
请教,百度IP定位API返回的JSON,用javascript怎么获取返回值?