JSON 库是否允许引用斜线?
Is a JSON library allowed to quote slashes?
我注意到,根据实施情况,一些 JSON 库会引用 /
个字符,而另一些则不会。
示例 1:Lua
local cjson = require 'cjson'
print(cjson.encode({ x = "/" }))
--> {"x":"\/"}
示例 2:JavaScript
console.log(JSON.stringify({ x: "/" }))
--> '{"x":"/"}'
我想知道 Lua 的 cjson 库的引用是错误还是有效功能。如果不是,我担心通过网络发送的 base64 编码字符串应该由任何语言处理。我担心 Lua cjson 在第一次解码 JSON 字符串后更改字符串时可能会产生意外的副作用,而不是再次对其进行编码,例如:
local x = '{"x":"/"}'
print(x)
--> {"x":"/"}
print(cjson.encode(cjson.decode(x)))
--> {"x":"\/"}
我想知道这是否被允许。还是一样的JSON数据吗?我原以为实际的字符串内容不应该通过应用解码和编码操作来改变。
是否允许在 JSON 中引用 '/'
,或者它是否以不符合标准的方式更改有效负载?
根据我的测试,假设 "/" == "\/"
不能在不同语言之间移植。在一小部分语言样本中,我发现了不同的结果。有些人接受,有些人不接受,有些人接受但发出警告(因此它可能不可移植)。这是一个概述:
+------------+-------------+----------------------------------+
| Language | "/" == "\/" | Notes |
+------------+-------------+----------------------------------+
| Lua | true | - |
| JavaScript | true | - |
| C++ | true | warning: unknown escape sequence |
| Python | false | - |
| Ruby | true | - |
+------------+-------------+----------------------------------+
The spec 定义一个字符串为
所以序列\/
显然是允许的。但没必要,因为/
也属于"Any Unicode character except "
or \
or control character"范围。
在这种情况下 "warning: unknown escape sequence" 不正确。
If it is not, I'm concerned about base64 encoded strings that are sent over the network and should be processed by any language.
我不确定我是否理解。 Base64和JSON没有任何关系。
经过the ECMA-404 spec,应该被允许:
\/ represents the solidus character (U+002F).
The following four cases all produce the same result:
- "\u002F"
- "\u002f"
- "\/"
- "/"
我注意到,根据实施情况,一些 JSON 库会引用 /
个字符,而另一些则不会。
示例 1:Lua
local cjson = require 'cjson'
print(cjson.encode({ x = "/" }))
--> {"x":"\/"}
示例 2:JavaScript
console.log(JSON.stringify({ x: "/" }))
--> '{"x":"/"}'
我想知道 Lua 的 cjson 库的引用是错误还是有效功能。如果不是,我担心通过网络发送的 base64 编码字符串应该由任何语言处理。我担心 Lua cjson 在第一次解码 JSON 字符串后更改字符串时可能会产生意外的副作用,而不是再次对其进行编码,例如:
local x = '{"x":"/"}'
print(x)
--> {"x":"/"}
print(cjson.encode(cjson.decode(x)))
--> {"x":"\/"}
我想知道这是否被允许。还是一样的JSON数据吗?我原以为实际的字符串内容不应该通过应用解码和编码操作来改变。
是否允许在 JSON 中引用 '/'
,或者它是否以不符合标准的方式更改有效负载?
根据我的测试,假设 "/" == "\/"
不能在不同语言之间移植。在一小部分语言样本中,我发现了不同的结果。有些人接受,有些人不接受,有些人接受但发出警告(因此它可能不可移植)。这是一个概述:
+------------+-------------+----------------------------------+
| Language | "/" == "\/" | Notes |
+------------+-------------+----------------------------------+
| Lua | true | - |
| JavaScript | true | - |
| C++ | true | warning: unknown escape sequence |
| Python | false | - |
| Ruby | true | - |
+------------+-------------+----------------------------------+
The spec 定义一个字符串为
所以序列\/
显然是允许的。但没必要,因为/
也属于"Any Unicode character except "
or \
or control character"范围。
在这种情况下 "warning: unknown escape sequence" 不正确。
If it is not, I'm concerned about base64 encoded strings that are sent over the network and should be processed by any language.
我不确定我是否理解。 Base64和JSON没有任何关系。
经过the ECMA-404 spec,应该被允许:
\/ represents the solidus character (U+002F).
The following four cases all produce the same result:
- "\u002F"
- "\u002f"
- "\/"
- "/"