Swift 中的服务器响应不匹配模型(无记录)
Server Response Not matching model (no records) in Swift
抱歉,如果问题含糊不清,但我会尽量表达。
我有以下型号:
struct Posts: Codable, Identifiable {
let id: String
let title: String
let content: String
enum CodingKeys: String, CodingKey {
case id = "_id"
case title
case content
}
}
如果找到 post,服务器响应将是相同的模型,没有问题,因为 JSON 与模型匹配。
但是如果服务器 returns 没有找到错误 post,这将是响应 JSON:
{
"error": "No records found"
}
发生这种情况时我会收到以下信息:
keyNotFound(CodingKeys(stringValue: "id", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: "id", intValue: nil) ("id").", underlyingError: nil))
处理此问题的最佳方法是什么?
更新:
谢谢jnpdx!
所以,我做了一个 ErrorResponse 结构,它确实捕获了这样的错误响应:
struct ErrorResponse: Codable {
let error: String
enum CodingKeys: String, CodingKey {
case error
}
}
那么在我的 APIServices 文件中,我该如何处理呢?
// this is what gets the Post data
let decodedData = try JSONDecoder().decode(Post?.self, from: data)
//Do I need another JSONDecoder to also catch the error below the above line like this?
let decodedDataError = try JSONDecoder().decode(ErrorResponse?.self, from: data)
在评论中,我们讨论了创建一个结构来模拟错误,看起来您已经完成了。要解决您的后续问题,不,您不需要单独的 JSONDecoder
。你也可能不应该解码选项。
不仅有一种方法可以正确执行此操作,而且您的函数可能看起来像这样:
let decoder = JSONDecoder()
do {
let post = try decoder.decode(Post.self, from: data)
//handle the post
} catch {
//try to decode an error
if let error = try? decoder.decode(ErrorResponse.self, from: data) {
//handle an API error
}
//handle an unknown error
}
抱歉,如果问题含糊不清,但我会尽量表达。
我有以下型号:
struct Posts: Codable, Identifiable {
let id: String
let title: String
let content: String
enum CodingKeys: String, CodingKey {
case id = "_id"
case title
case content
}
}
如果找到 post,服务器响应将是相同的模型,没有问题,因为 JSON 与模型匹配。
但是如果服务器 returns 没有找到错误 post,这将是响应 JSON:
{
"error": "No records found"
}
发生这种情况时我会收到以下信息:
keyNotFound(CodingKeys(stringValue: "id", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: "id", intValue: nil) ("id").", underlyingError: nil))
处理此问题的最佳方法是什么?
更新:
谢谢jnpdx!
所以,我做了一个 ErrorResponse 结构,它确实捕获了这样的错误响应:
struct ErrorResponse: Codable {
let error: String
enum CodingKeys: String, CodingKey {
case error
}
}
那么在我的 APIServices 文件中,我该如何处理呢?
// this is what gets the Post data
let decodedData = try JSONDecoder().decode(Post?.self, from: data)
//Do I need another JSONDecoder to also catch the error below the above line like this?
let decodedDataError = try JSONDecoder().decode(ErrorResponse?.self, from: data)
在评论中,我们讨论了创建一个结构来模拟错误,看起来您已经完成了。要解决您的后续问题,不,您不需要单独的 JSONDecoder
。你也可能不应该解码选项。
不仅有一种方法可以正确执行此操作,而且您的函数可能看起来像这样:
let decoder = JSONDecoder()
do {
let post = try decoder.decode(Post.self, from: data)
//handle the post
} catch {
//try to decode an error
if let error = try? decoder.decode(ErrorResponse.self, from: data) {
//handle an API error
}
//handle an unknown error
}