JSONDecoder如何知道要使用哪种编码?

时间:2019-03-01 00:42:57

标签: json swift

我像个好孩子一样读过Joel on Encoding,发现自己对Foundation JSONDecoder的运作感到困惑,他们的initdecode方法都不具有编码值。查看文档,我看到了实例变量dataDecodingStrategy,也许这就是发生编码猜测魔术的地方...?

我在这里错过了什么吗? JSONDecoder不需要知道接收到的数据的编码吗?我意识到JSON标准要求此数据必须以UTF-8编码,但是JSONDecoder可以做出这样的假设吗?我很困惑。

1 个答案:

答案 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。