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

Php 为什么JSON编码器在编码URL时添加转义字符?,php,json,Php,Json,我在PHP中使用json\u encode对URL进行编码 $json_string = array ('myUrl'=> 'http://example.com'); echo json_encode ($json_string); 上述代码生成以下JSON字符串: {"myUrl":"http:\/\/example.com"} 而不是 {"myUrl":"http://example.com"} 我只是个新手,哪个输出是正确的?JSON解析器能够正确地计算第二个输出吗?我

我在PHP中使用
json\u encode
对URL进行编码

$json_string = array ('myUrl'=> 'http://example.com');
echo json_encode ($json_string);
上述代码生成以下JSON字符串:

{"myUrl":"http:\/\/example.com"}   
而不是

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

我只是个新手,哪个输出是正确的?JSON解析器能够正确地计算第二个输出吗?

我的猜测是,该函数的编写者添加了不必要的编码,完全是出于无知。不需要转义前斜杠

我所认识的许多程序员都和世界上其他人一样,在保持直线方面做得很差。还有更多的人在正确地进行编码和解码时表现不佳

更新:

在做了一些搜索之后,我发现。它提出了一个好的观点,即对
/
进行转义有时对于糟糕的HTML解析器是必要的。我曾经遇到过一个问题,当IE 6错误地处理这样的内容时:

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

var json={scriptString://JavaScript here*/“};
IE 6会看到字符串内部的
,过早地关闭脚本标记。因此,这比IE 6更安全(虽然字符串中的开始脚本标记也可能会破坏某些东西…我记不起来了):


var json={scriptString:\/*JavaScript here*\/“};
他们还说,一些糟糕的解析器会在http://中看到
//
,并将行的其余部分视为JavaScript注释

因此,这似乎是互联网技术被浏览器故障劫持的又一个例子。

根据,人们应该避开这个字符,尽管在JavaScript中这并不是绝对必要的:

也可以在php.net上阅读本文,进行简短的讨论

见第2.5节:

可以放置所有Unicode字符 在引号内,除了 必须转义的字符: 引号、反向索利多金币和 控制字符(U+0000到 U+001F)

任何字符都可以转义


所以听起来不需要转义,但可以转义,网站(和RFC中的文本图)将其说明为转义。

我看到了另一个问题。字符串结果
{“myUrl”:http://example.com“}
不应引用成员名称myUrl。在JavaScript和JSON中,我认为所有对象文本成员ID都是不带引号的字符串。因此,我希望结果是
{myUrl:http://example.com“}

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


编辑,2011年2月11日:是的,我错了。JSON语法甚至要求字段名用双引号括起来。

如果您使用的是PHP5.4,您可以使用
JSON\u encode
选项。看


PHP5.3中添加了几个选项,但在5.4中添加了
JSON\u UNESCAPED\u斜杠。
我认为这解决了您的问题

json_encode ($json_string, JSON_UNESCAPED_SLASHES );
您可以查看文档:




我同意。但值得注意的是,结果字符串是有效的。在javascript字符串中,可以通过在任何字符前面加反斜杠来转义该字符。因此,Javascript将“\/”解释为简单的“/”。JSON与Javascript不同。在JSON中,您不允许反斜杠任何您喜欢的内容。但奇怪的是,您可以在字符串中反斜杠,所以它仍然有效。:)
json_encode ($json_string, JSON_UNESCAPED_SLASHES );