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

JSON值包含转义字符导致解码失败的解决方案咨询

JSON值包含转义字符导致解码失败的解决方案咨询

首先我试了下你贴的代码,其实这段代码是能正常解码的——输出会是ResponseDTO(overview: Optional("I \n love \n you.")),并没有报错。所以我猜你实际遇到的应该是服务器返回的JSON里存在双重转义的情况(比如把换行符写成了\\n而不是\n),或者是其他未正确转义的特殊字符导致了解码失败?

针对这类转义字符相关的解码问题,给你几个可行的解决方案:

  • 预处理JSON字符串:如果确定是双重转义的问题,可以先把JSON字符串里多余的转义符替换掉,再进行解码。比如把\\n替换成\n,示例代码如下:
let jsonStr = """
{
  "overview": "I \\n love \\n you."
}
"""

// 预处理:替换双重转义的换行符
let processedJsonStr = jsonStr.replacingOccurrences(of: "\\\\n", with: "\\n")
guard let jsonData = processedJsonStr.data(using: .utf8) else { return }

func task() {
  do {
    let response = try JSONDecoder().decode(ResponseDTO.self, from: jsonData)
      print(response)
  } catch {
    print("Failed to decode: \(error)")
  }
}

task()
  • 用JSONSerialization手动处理:如果Decodable直接解码报错,可以先把数据序列化为字典,再手动处理字符串里的转义:
func taskWithSerialization() {
    do {
        guard let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any],
              let rawOverview = jsonObject["overview"] as? String else {
            print("Invalid data format")
            return
        }
        // 处理转义字符,这里根据实际情况替换对应的转义
        let processedOverview = rawOverview.replacingOccurrences(of: "\\n", with: "\n")
        let response = ResponseDTO(overview: processedOverview)
        print(response)
    } catch {
        print("Failed to serialize: \(error)")
    }
}
taskWithSerialization()
  • 自定义Decodable解码逻辑:如果想在解码阶段就完成转义处理,可以修改ResponseDTO的初始化方法,手动处理解码后的字符串:
struct ResponseDTO: Decodable {
  let overview: String?
  
  enum CodingKeys: CodingKey {
    case overview
  }
  
  init(from decoder: any Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    if let rawOverview = try container.decodeIfPresent(String.self, forKey: .overview) {
        // 这里根据实际需要处理转义,比如替换双重转义的换行符
        self.overview = rawOverview.replacingOccurrences(of: "\\n", with: "\n")
    } else {
        self.overview = nil
    }
  }
}

最后想提醒一句:前端处理转义只是临时的 workaround,最稳妥的方式是和后端同事沟通,让他们返回格式标准的JSON数据——毕竟转义字符的处理应该在数据生成端就做好,这样能避免后续更多的兼容性问题。

备注:内容来源于stack exchange,提问作者sweetSwift

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 09:54:37