JSON库是否允许引用斜杠?
我注意到,根据实现的不同,一些JSON库引用JSON库是否允许引用斜杠?,json,quoting,Json,Quoting,我注意到,根据实现的不同,一些JSON库引用/字符,而其他库则不引用 例1:Lua local cjson = require 'cjson' print(cjson.encode({ x = "/" })) --> {"x":"\/"} 示例2:JavaScript console.log(JSON.stringify({ x: "/" })) --> '{"x":"/"}' 我想知道引用Lua的cjson Library是一个bug还是一个有效的特性。如果不是,我关心的是通过
/
字符,而其他库则不引用
例1:Lua
local cjson = require 'cjson'
print(cjson.encode({ x = "/" }))
--> {"x":"\/"}
示例2:JavaScript
console.log(JSON.stringify({ x: "/" }))
--> '{"x":"/"}'
我想知道引用Lua的cjson Library是一个bug还是一个有效的特性。如果不是,我关心的是通过网络发送的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 | - |
+------------+-------------+----------------------------------+
将字符串定义为
因此序列\/
显然是允许的。但这不是必需的,因为/
也属于“除以外的任何Unicode字符”
或\
或控制字符”范围
在这种情况下,“警告:未知转义序列”不正确
如果不是,我关心的是通过网络发送的base64编码字符串,它们应该由任何语言处理 我不确定我是否理解。Base64和JSON彼此无关。将字符串定义为 因此序列
\/
是明确允许的。但这不是必需的,因为/
也属于“除以外的任何Unicode字符”
或\
或控制字符”范围
在这种情况下,“警告:未知转义序列”不正确
如果不是,我关心的是通过网络发送的base64编码字符串,它们应该由任何语言处理 我不太明白。Base64和JSON互不相关。过去,应该允许: \/表示索利多金币字符(U+002F) 以下四种情况都会产生相同的结果:
- “\u002F”
- “\u002f”
- “\/”
- “/”
- “\u002F”
- “\u002f”
- “\/”
- “/”
关于测试方法,请注意,
“/”=“\/”
正在测试语言字符串文字格式和字符串比较行为。另一方面,JSON编码的数据必须由JSON解析器读取,JSON解析器可以(并且确实)解析特定JSON格式的字符串。下面的答案解释了为什么\/
和/
都有效。关于您的测试方法,请注意“/”=“\/”
正在测试语言字符串文字格式和字符串比较行为。另一方面,JSON编码的数据必须由JSON解析器读取,JSON解析器可以(并且确实)解析特定JSON格式的字符串。下面的答案解释了为什么\/
和/
都有效。JSON数据包含表示Base64编码数据的字符串。如果这些字符串被更改,我担心接收器在解码它们时不会得到相同的结果。我同意,Base64与JSON无关,但这只是一个例子,我对JSON库对字符串所做的更改感到不舒服。我是这样想的,但JSON中的字符串是JSON字符串,不管它是否有点像Base64。解码后,它可以是任何内容,从纯文本到HTML再到Base64。一个未损坏的JSON解析器在遇到\/
时会做正确的事情,考虑到解析器的一般工作方式(以及规范的外观),没有理由认为这会比\\
或\u002f
造成更多的问题。谢谢,这是一个很好的观点。我还得出结论,以这种方式发送数据是安全的。JSON数据包含表示Base64编码数据的字符串。如果这些字符串被更改,我担心接收器在解码它们时不会得到相同的结果。我同意,Base64与JSON无关,但这只是一个例子,我对JSON库对字符串所做的更改感到不舒服。我是这样想的,但JSON中的字符串是JSON字符串,不管它是否有点像Base64。解码后,它可以是任何内容,从纯文本到HTML再到Base64。一个未损坏的JSON解析器在遇到\/
时会做正确的事情,考虑到解析器的一般工作方式(以及规范的外观),没有理由认为这会比\\
或\u002f
造成更多的问题。谢谢,这是一个很好的观点。我还得出结论,以这种方式发送数据是安全的。