Swift中JSONDecoder解析含转义双引号的JSON失败,求解决方案
Swift JSONDecoder解析含转义双引号的JSON失败问题
在Swift Playground中运行代码时,会发现解码后的对象为nil。JSON字符串[{"transcript":"A person might say, \"Hello\"."}]能通过各类JSON校验工具验证,但Swift默认的JSONDecoder却无法处理transcript字段中的转义双引号(\");移除该转义双引号后,解析就能正常进行。
这并非Swift JSONDecoder的Bug,问题出在Swift多行字符串字面量的转义规则上。另外,单独在Swift代码中使用转义双引号时能正常显示"符号,相同的JSON字符串在JavaScript中也能正常解析,这个问题已对应用运行造成较大影响。
可复现问题的代码
var testData2 = """ [{"transcript":"A person might say, \"Hello\"."}] """ struct TranscriptModel: Codable, Identifiable { let id = UUID() let transcript : String } typealias Transcripts = [TranscriptModel] let decodedResponse1 = try? JSONDecoder().decode(Transcripts.self, from: Data(testData2.utf8)) print(decodedResponse1)
问题原因与解决办法
原因
在Swift的"""多行字符串字面量中,\"的作用是在字符串中插入一个双引号,而非保留反斜杠加双引号的组合。这导致最终生成的JSON字符串里,transcript的内容变成了A person might say, "Hello".——而JSON规范要求字符串内部的双引号必须用\"转义,所以这个字符串实际不符合JSON格式,JSONDecoder自然无法解析。
解决办法
有两种方式可以让JSON字符串正确包含转义双引号:
- 方式一:在多行字符串中使用双反斜杠
要在多行字符串里表示JSON需要的\",需要用\\",这样Swift会将其解析为单个反斜杠加双引号,生成符合规范的JSON:var testData2 = """ [{"transcript":"A person might say, \\"Hello\\"."}] """ - 方式二:使用单行字符串字面量
单行字符串中,\"会被正确解析为转义双引号,直接使用即可:var testData2 = "[{\"transcript\":\"A person might say, \\\"Hello\\\".\"}]"
修改后再运行代码,JSONDecoder就能正常解析出包含双引号的transcript内容了。
内容的提问来源于stack exchange,提问作者Saamer
相关产品推荐
相关产品推荐

