我在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解析器能够正确评估第二个输出吗?
答案 0 :(得分:9)
根据http://www.json.org/,人们应该逃避这个角色,尽管在JavaScript中并不是绝对必要的:
另请阅读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语法甚至要求字段名称都是双引号。