我像个好孩子一样读过Joel on Encoding,发现自己对Foundation JSONDecoder
的运作感到困惑,他们的init
或decode
方法都不具有编码值。查看文档,我看到了实例变量dataDecodingStrategy,也许这就是发生编码猜测魔术的地方...?
我在这里错过了什么吗? JSONDecoder
不需要知道接收到的数据的编码吗?我意识到JSON标准要求此数据必须以UTF-8编码,但是JSONDecoder
可以做出这样的假设吗?我很困惑。
答案 0 :(得分:1)
RFC 8259(自2017年起)要求
在不属于封闭生态系统的系统之间交换的JSON文本必须使用UTF-8进行编码。
年龄较大的RFC 7159(从2013年开始)和RFC 7158(从2013年开始)仅表示
JSON文本应以UTF-8,UTF-16或UTF-32编码。默认值 编码为UTF-8,使用UTF-8编码的JSON文本为 从某种意义上说,它们可以互操作, 最大实施次数;有很多实现 无法成功读取其他编码(例如 UTF-16和UTF-32)。
还有RFC 4627(自2006年以来,我可以找到的最古老的):
JSON文本应以Unicode编码。默认编码是 UTF-8。
由于JSON文本的前两个字符始终为ASCII 字符,可以确定是否为八位字节 通过查看,流是UTF-8,UTF-16(BE或LE)或UTF-32(BE或LE) 在前四个八位位组为空的模式。
JSONDecoder
(在后台使用JSONSerialization
)能够解码Little-endian和Big-endian的UTF-8,UTF-16和UTF-32。示例:
let data = "[1, 2, 3]".data(using: .utf16LittleEndian)!
print(data as NSData) // <5b003100 2c002000 32002c00 20003300 5d00>
let a = try! JSONDecoder().decode([Int].self, from: data)
print(a) // [1, 2, 3]
由于有效的JSON文本必须以“ [”或“ {”开头,因此可以明确地从数据的第一个字节确定编码。
尽管我没有找到这份文件记录,并且可能不应该依赖它。 JSONDecoder
的未来实现可能仅支持较新的标准,并且需要UTF-8。