You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:25:03