JSON:为什么正斜杠转义?


369

这样做的原因是“逃脱了”我。

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

为什么?


4
FWIW我从没见过在JSON中转义过正斜杠,我只是在Java库中注意到了它,位于code.google.com/p/json-simple
Jason S

24
json_encode()默认情况下,PHP的转义符使用正斜杠,但可以JSON_UNESCAPED_SLASHES选择从PHP 5.4.0开始(2012
Walter Tross

6
这是一个PHP代码,仅在'</'以下情况下不会转义每个斜杠:echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
rustyx

代码中是否包含'</':还是以echo开始?因为从回声开始对我来说失败了。我根本什么都没有。是的,我将$ obj替换为我的变量:)
marciokoko

JSON不会转义或序列化任何东西,而您的JSON序列化器却可以。您正在使用哪一个?
轨道轻度竞赛

Answers:


284

JSON不需要您执行此操作,而是允许您执行此操作。它还允许您将“ \ u0061”用于“ A”,但这不是必需的。\/在将JSON嵌入<script>标记中时允许帮助,该标记不允许</内部字符串出现,如Seb指出的那样。

Microsoft的一些ASP.NET Ajax / JSON API使用此漏洞来添加额外的信息,例如datetime将作为发送"\/Date(milliseconds)\/"。(Y)


4
转义</,那将是一件好事。尽管JSON并不经常嵌入脚本标记中。
鲁宾

8
有关ASP.NET JSON日期格式的基本原理,请参阅此博客文章:weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Michiel van Oosterhout

25
需要替换JSON,因为JSON序列化程序的特定实现会输出一些JSON(虽然是完全有效的JSON),但它具有一些额外的字符,因此也可以将其作为JS文字放入HTML脚本元素中!与其说是因为有人给他买了一套水翼,不如说是把婴儿带洗澡水扔出去。
昆汀2012年

15
我不明白的是为什么JSON序列化程序甚至会在意JSON的结尾。在网页上的HTTP请求中,无论如何。如果需要,请让最终渲染器进行其他编码。
丹·罗斯

5
@DanRoss而且可以。逃逸/不是必需的,这是允许的,以缓解使用JSON的。如果您不想逃脱/,那就不要。
安德烈亚斯

35

JSON规范说您可以转义正斜线,但不必这样做。


9
您可以添加指向该特定部分的链接吗?
瑞安·盖茨

1
规格没有这么说。实际上,这说明您必须逃避固执的性格。参见ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Joa Ebert,

10
@JoaEbert:必须逃避一个固相线,但是您不需要逃避固相线。第9节说:“除必须转义的字符外,所有字符都可以放在引号内:引号(U + 0022),反斜线(U + 005C)和控制字符U + 0000至U + 001F。 ”
哈罗德L

4
谢谢哈罗德!您是对的,也如图5所示,因为“除...以外的任何代码点”都清楚地表明/是可选的。
Joa Ebert

15

我前段时间问了同样的问题,不得不自己回答。这是我想出的:

似乎,我的第一个想法(是它的JavaScript根源)是正确的。

'\/' === '/'在JavaScript中,JSON 有效的JavaScript。但是,为什么\z在JSON中不允许其他忽略的转义符(如)?

这样做的关键是阅读http://www.cs.tut.fi/~jkorpela/www/revsol.html,然后 阅读 http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2。斜线转义的功能允许将JSON嵌入HTML(如SGML)和XML中。


5
结构化的数据有效载荷传递机制不应与语言结构联系在一起。因为将来可能会发生变化,但是如果有任何JSON创建者,这可能可以解释设计决策。

'\ /'==='/'因此,在接收jsonp时我不需要取消转义正斜杠?
2013年

8

PHP默认情况下转义正斜杠,这可能是为什么它如此常见的原因。我不知道为什么,但可能是因为嵌入字符串"</script>"一个内部<script>标签被认为是不安全的。

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


5

丑陋的PHP!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES必须是默认的,而不是一个(奇怪)选项... 怎么说给PHP开发人员?

默认情况下一定是最频繁使用,以及(电流)使用最广泛的标准UTF8。Github或其他地方有多少PHP代码片段需要这种外来的“嵌入HTML”功能?


2
说的对!但是,PHP会将所有奇怪的错误推广到未来,以免破坏所有已损坏的有历史性的PHP代码段中以前常见的错误,这些错误代码像有害生物一样散布在世界各地。因此,PHP做出的所有那些错误决定(这意味着几乎所有有关PHP的决定)都成为了标准。您不能期望标准会发生变化,因此,每个PHP开发人员都必须了解并实现针对PHP中发现的所有严重bug的所有无数解决方法。输入stackoverflow ..
Tino

你是完全错误的。这是由于JavaScript。如下所述。在JS中'\/' === '/'返回true。我建议你坚持事实。大多数人都能应付一些不一致的函数名称。仅仅因为您看不到过去就不会使PHP成为不良工具。
Cobolt

1
@Cobolt,您好,这是一个老问题,我今天不使用PHP ...但是,作为讨论博客,核心是“默认值必须是最频繁使用”,因此,丑陋之处在于忽略了这种“最频繁使用”的行为(也很丑)。
彼得·克劳斯

1
这不是关于任何特定语言的地方。指出PHP 目前正在做什么,以及如何禁用它会更有帮助,现在添加了一个答案来做到这一点
IMSoP
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.