如何优雅解码API返回的空JSON对象?
规范处理API返回的空JSON对象
你当前直接比对原始Data的方式不够灵活(比如服务器返回带空格的{ }就会失效),推荐两种更规范的处理方式:
方式一:解码为字典判断空值
直接将响应数据解码成[String: Any]类型,通过判断字典是否为空来识别空JSON对象,JSONDecoder会自动忽略JSON中的空白字符(包括换行、空格),无需额外处理{}\n这类变体:
let (data, response) = try await URLSession.shared.data(for: request) // 先尝试解码为空字典 do { let emptyDict = try JSONSerialization.jsonObject(with: data) as? [String: Any] if emptyDict?.isEmpty == true { print("empty json response") return nil } } catch { // 不是空字典,继续解码预期类型 } // 解码预期数据 let decoded = try JSONDecoder().decode(YourExpectedType.self, from: data)
方式二:自定义空响应类型(类型更安全)
定义一个仅表示空JSON对象的Decodable类型,先尝试解码该类型,成功则说明是空响应,失败再解码预期数据:
// 自定义空响应类型 struct EmptyResponse: Decodable {} let (data, response) = try await URLSession.shared.data(for: request) // 先尝试解码空响应 do { _ = try JSONDecoder().decode(EmptyResponse.self, from: data) print("empty json response") return nil } catch { // 解码失败,说明不是空响应,解码预期类型 let decoded = try JSONDecoder().decode(YourExpectedType.self, from: data) // 处理解码后的数据 }
为什么这两种方式更好?
- 无需硬编码匹配特定的Data或字符串,能兼容服务器返回的各种空白字符变体(比如
{ }、{}\r\n等) - 符合JSON解码的规范流程,避免直接操作原始数据的潜在问题
内容的提问来源于stack exchange,提问作者kissy
相关产品推荐
相关产品推荐

