为什么JSON编码器在编码URL时添加转义字符?

14
我正在使用 PHP 中的 json_encode 对 URL 进行编码。
$json_string = array ('myUrl'=> 'http://example.com');
echo json_encode ($json_string);

以上代码生成以下 JSON 字符串:

{"myUrl":"http:\/\/example.com"}   

与其

{"myUrl":"http://example.com"}

我是一个新手,哪个输出是正确的?JSON解析器能够正确评估第二个输出吗?

5个回答

9
根据https://www.json.org/,尽管在JavaScript中不是必须的,但应对该字符进行转义。

strings

请阅读php.net上的相关错误报告,了解更简短的讨论。

请参见RFC的2.5节:

引号内可以放置所有Unicode字符,除了必须转义的字符: 引号、反斜杠和控制字符(U+0000到U+001F)。

任何字符都可以被转义。

所以似乎不需要转义,但它可以被转义,并且网站(以及RFC中的文本图表)将其表示为已转义。


8
我猜那个函数的编写者仅仅是出于无知而添加了不必要的编码。转义正斜杠是不必要的
我认识的程序员中有惊人数量的人在保持他们的斜杠方向上和其他人一样差劲。而更多的人在正确地进行编码和解码方面表现得真的很差。
更新:
经过一些搜索,我找到了这个讨论。它提出了一个很好的观点,即有时候需要转义/以修复糟糕的HTML解析器。我曾经遇到过一个问题,当IE 6错误处理这样的内容时:
<script>
    var json = { scriptString: "<script> /* JavaScript here */ </script>" };
</script>

IE 6会看到字符串中的</script>并提前关闭脚本标记。因此,这种方法更适用于IE 6(尽管字符串中的开放脚本标记也可能破坏一些东西……我忘记了):

<script>
    var json = { scriptString: "<script> \/* JavaScript here *\/ <\/script>" };
</script>

他们还说一些糟糕的解析器会将//视为JavaScript注释符,导致其后面的内容被忽略,这似乎又是因为浏览器故障而导致的互联网技术被劫持。

1
我同意。但值得注意的是,生成的字符串是有效的。在JavaScript字符串中,您可以通过在字符前面加上反斜杠来转义任何字符。因此,"\ /"被JavaScript解释为简单的'/'。 - Lee
1
JSON和JavaScript不同。在JSON中,您不能反斜杠任何您喜欢的内容。但奇怪的是,在字符串中,您可以反斜杠一个斜杠,因此它仍然有效。 :) - hobbs

5
如果您使用的是php 5.4,您可以使用json_encode选项。请参阅手册。在php 5.3中添加了几个选项,但是在5.4中添加了JSON_UNESCAPED_SLASHES

5

-2

我在这里看到另一个问题。字符串结果{"myUrl":"http://example.com"}不应该引用成员名称myUrl。在JavaScript和JSON中,我认为所有对象文字成员ID都是未引用的字符串。因此,我期望结果为{myUrl:"http://example.com"}

这似乎是PHP中的一个很大的错误,所以我一定是错了。

编辑,2/11/11:是的,我错了。JSON语法要求甚至字段名称也必须用双引号括起来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接