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
相关产品推荐
相关产品推荐

