Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON:为什么前斜杠会被转义?_Javascript_Json - Fatal编程技术网

Javascript JSON:为什么前斜杠会被转义?

Javascript JSON:为什么前斜杠会被转义?,javascript,json,Javascript,Json,我不明白为什么会这样 转义正斜杠,因此哈希{a:“a/b/c”}被序列化为{a:“a\/b\/c”},而不是{a:“a/b/c”} 为什么?JSON规范说您可以避开正斜杠,但您不必这样做。JSON不要求您这样做,它允许您这样做。它还允许您将“\u0061”用于“A”,但这不是必需的。允许\/有助于在标记中嵌入JSON,这不允许,我不久前问过,不得不自己回答。以下是我的想法: 看来,我的第一个想法是正确的 JavaScript中的'\/'=='/',JSON是有效的JavaScript。然而, 为

我不明白为什么会这样

转义正斜杠,因此哈希
{a:“a/b/c”}
被序列化为
{a:“a\/b\/c”}
,而不是
{a:“a/b/c”}


为什么?

JSON规范说您可以避开正斜杠,但您不必这样做。

JSON不要求您这样做,它允许您这样做。它还允许您将“\u0061”用于“A”,但这不是必需的。允许
\/
有助于在
标记中嵌入JSON,这不允许
,我不久前问过,不得不自己回答。以下是我的想法:

看来,我的第一个想法是正确的

JavaScript中的
'\/'=='/'
,JSON是有效的JavaScript。然而, 为什么JSON中不允许其他被忽略的转义(如
\z
)呢

关键是阅读 ,然后是 . 特征 斜杠转义允许将JSON嵌入HTML(作为SGML)和XML中

丑陋的PHP!
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
必须是默认选项,而不是(奇怪的)选项如何对php开发人员说?

默认值必须是使用最频繁的,以及(当前)使用最广泛的标准,如UTF8。Github或其他地方有多少PHP代码片段需要这种独特的“嵌入HTML”功能?

这可能就是为什么这种情况如此普遍的原因。我不知道为什么,但可能是因为将字符串
嵌入
标记中被认为是不安全的



通过传递
JSON\u UNESCAPED\u SLASHES
标志可以禁用此功能,但大多数开发人员不会使用此标志,因为原始结果已经是有效的JSON。

这将是一件好事,请看这篇博客文章,了解ASP.NET JSON日期格式的基本原理:JSON需要被替换,因为JSON序列化程序的特定实现会输出一些JSON,这些JSON(虽然是完全有效的JSON)有一些额外的字符,所以它也可以作为JS文本放入HTML脚本元素中?!与其说是把孩子和洗澡水一起扔出去,不如说是把孩子扔出去,因为有人给他买了一套水翅。我不明白的是,为什么JSON序列化程序甚至会关心JSON的结局。在网页上,在HTTP请求中,等等。如果需要,让最终渲染器进行额外编码。@DanRoss,它可以。转义
/
不是必需的,而是允许的,以简化JSON的使用。如果您不想转义
/
,那么就不要转义。FWIW我从来没有见过用JSON转义的斜杠,我只是注意到PHP的
JSON_encode()
默认情况下转义斜杠,但是从PHP5.4.0开始有
JSON_UNESCAPED_slashes
选项(2012年3月)这里有一个PHP代码,它不会对每个斜杠进行转义,只有在
中,代码才会包含“JSON不会转义或序列化任何内容…”。。。您的JSON序列化程序可以。您使用的是哪一种?结构化数据有效负载交付机制不应与语言构造绑定。因为这在将来可能会发生变化…但这可能解释了设计决策(如果有任何JSON创建者)。\/'==='/'因此,在接收我的jsonp时,我不需要取消前向斜杠?您可以添加指向该特定对象的链接吗节?@JoaEbert:反向索利多金币必须转义,但你不需要转义索利多金币。第9节说“除必须转义的字符外,所有字符都可以放在引号内:引号(U+0022)、反向索利多金币(U+005C)和控制字符U+0000到U+001F。”谢谢Harold!您是对的,如图5所示,因为“除…之外的任何代码点”清楚地表明/是可选的!然而,PHP将所有奇怪的错误推广到了未来,以避免打破所有那些像害虫一样传播到世界各地的被破坏的历史PHP代码片段中的任何常见错误。因此,PHP做出的所有错误决策(这意味着几乎所有关于PHP的决策)都成为标准。您不能期望标准发生变化,因此每个PHP开发人员都必须了解并实现所有这些针对PHP中发现的所有严重错误的无限多的变通方法。输入stackoverflow..你完全错了。这是由于JavaScript。正如下文所指出的那样。在JS
中,\/'=='/'
返回true。我建议你坚持事实。大多数人能够处理一些不一致的函数名。只是因为你看不到过去,所以PHP不是一个好工具。嗨@Cobolt,这是一个老问题,我今天不使用PHP。。。但是,作为讨论博客,其核心是“默认必须是最频繁的使用”,因此“丑陋”是指忽略Javascript的这种“最频繁的使用”(也是丑陋的)行为。这不是抱怨任何特定语言的地方。指出PHP目前的功能以及如何禁用它会更有帮助,并且“被认为是不安全的”->它确实是不安全的。利用:
让身体发出警报(“地板”)试试看,主体将向地板发出警报,而不是得到一个名为“the”的变量,该变量的值中有脚本标记。你可以说“那么就不要把它嵌入页面”,是的,这是一个可能的解决办法,但是很多人还是这样做的(所以让我们做一些好的转义函数,因为为什么不呢)坦率地说,我理解他们的观点:如果在JavaScript中使用正确转义数据值的JSON数据是安全的,那就有意义了。感谢@Luc——PHP选择默认转义斜杠的一个很好的例子!默认情况下,函数应该是安全的,并且只有在您特别希望这样做时才是不安全的。