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

Mar*_*k K 12 php json

json_encode在PHP中使用来编码URL

$json_string = array ('myUrl'=> 'http://example.com');
echo json_encode ($json_string);
Run Code Online (Sandbox Code Playgroud)

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

{"myUrl":"http:\/\/example.com"}   
Run Code Online (Sandbox Code Playgroud)

而不是

{"myUrl":"http://example.com"}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*hew 9

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

字符串

另请阅读php.net上的相关错误报告,以获得简短的讨论.

请参阅RFC的 2.5 :

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

任何角色都可能被转义.

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


Jac*_*cob 8

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

我所知道的程序员数量惊人,与世界其他地方一样直截了当.而正确编码和解码的数字甚至更多.

更新:

在做了一些搜索之后,我遇到了这个讨论.它提出了一个很好的观点,即/错误的HTML解析器有时需要转义a .当IE 6错误地处理这样的内容时,我遇到了一个问题:

<script>
    var json = { scriptString: "<script> /* JavaScript here */ </script>" };
</script>
Run Code Online (Sandbox Code Playgroud)

IE 6会看到</script>字符串的内部并过早关闭脚本标记.因此,这是更安全的IE 6(虽然字符串中的开始脚本标签也可能会破坏事情......我不记得了):

<script>
    var json = { scriptString: "<script> \/* JavaScript here *\/ <\/script>" };
</script>
Run Code Online (Sandbox Code Playgroud)

而且他们也说一些不好的解析器会看到//http://和对待该行的其余部分像一个JavaScript注释.

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


Bab*_*dad 5

如果您使用的是 php 5.4,则可以使用json_encode选项。参见手册

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


Naj*_*kib 5

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

json_encode ($json_string, JSON_UNESCAPED_SLASHES );
Run Code Online (Sandbox Code Playgroud)

您可以查看文档:

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

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