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

时间:2010-09-16 02:11:15

标签: php json

我在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 个答案:

答案 0 :(得分:9)

根据http://www.json.org/,人们应该逃避这个角色,尽管在JavaScript中并不是绝对必要的:

strings

另请阅读php.net上的related bug report进行简短讨论。

RFC中的2.5:

  

可以放置所有Unicode字符   在引号内除外   必须转义的字符:   引号,反向固定,和   控制字符(U + 0000到   U + 001F)。

     

任何角色都可能被转义。

所以它听起来不像需要被转义,但它可以,并且网站(以及RFC中的文本图表)将其说明为被转义。

答案 1 :(得分:8)

我的猜测是,该函数的编写者通过简单的无知添加了不必要的编码。转义正斜杠是必需。

令人惊讶的是,我所知道的大量程序员与世界其他地方一样保持他们的直线。而正确编码和解码的数字甚至更多。

<强>更新

在进行一些搜索后,我遇到了this discussion。它提出了一个好点,即错误的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>

他们还说一些不好的解析器会在//中看到http://,并将其余部分视为JavaScript注释。

所以看起来这是互联网技术被浏览器失败劫持的又一个案例。

答案 2 :(得分:4)

如果您使用的是PHP 5.4,则可以使用json_encode选项。请参阅manual

在php 5.3中添加了几个选项,但在5.4中添加了JSON_UNESCAPED_SLASHES

答案 3 :(得分:2)

我认为这可以解决您的问题

json_encode ($json_string, JSON_UNESCAPED_SLASHES );

您可以查看文档:

https://www.php.net/manual/en/function.json-encode.php

https://www.php.net/manual/en/json.constants.php

答案 4 :(得分:-2)

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

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

编辑,2/11/11:是的,我错了。 JSON语法甚至要求字段名称都是双引号。