JSON/simple 文本解析服务器响应 Swift 4 可解码
JSON/simple text parsing server response with Swift 4 Decodable
我遇到了以下问题。客户端 iOS 应用程序正在与某些后端服务协作,发送 2 种类型的响应:成功时 JSON 和错误时的简单文本。
对于 JSON 我有一个简单的可解码结构:
struct Response: Decodable {
let message: String
}
它一直有效,直到服务器在 http 正文中发送简单文本,我收到以下错误:
"Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start
with array or object and option to allow fragments not set."
也许 Response 结构对于这种情况可能更通用?
没有简单的方法让您的 Decodable
结构处理此类错误,因为万一您尝试解码的 Data
无效 JSON,init(from decoder:)
方法甚至没有被调用,所以你需要在初始化器的范围之外处理错误。
一种可能的解决方案是在 JSONDecoder.decode(Response.self,from:)
方法的 catch 块中处理错误。一旦 decode
函数抛出错误,您可以检查错误是否是由于输入不正确(在这种情况下很可能意味着输入是一个简单的字符串而不是 JSON)并且您可以简单地将响应数据转换为 String
,然后调用 Response
的成员初始化程序以使用字符串响应对其进行初始化。
以下示例展示了如何使用两个示例响应来处理这种情况,一个是有效的 JSON,另一个是简单的字符串。
let validJsonResponseData = """
{"message" : "A message"}
""".data(using: .utf8)!
let simpleTextResponseData = "Error".data(using: .utf8)!
struct Response: Decodable {
let message: String
}
do {
let successResponse = try JSONDecoder().decode(Response.self, from: validJsonResponseData)
let errorResponse = try JSONDecoder().decode(Response.self, from: simpleTextResponseData)
} catch {
if let error = error as? DecodingError {
switch error {
case .dataCorrupted(_):
if let simpleTextResponse = String(data: simpleTextResponseData, encoding: .utf8) {
let errorResponse = Response(message: simpleTextResponse)
}
default:
throw error
}
} else {
throw error
}
}
我遇到了以下问题。客户端 iOS 应用程序正在与某些后端服务协作,发送 2 种类型的响应:成功时 JSON 和错误时的简单文本。
对于 JSON 我有一个简单的可解码结构:
struct Response: Decodable {
let message: String
}
它一直有效,直到服务器在 http 正文中发送简单文本,我收到以下错误:
"Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set."
也许 Response 结构对于这种情况可能更通用?
没有简单的方法让您的 Decodable
结构处理此类错误,因为万一您尝试解码的 Data
无效 JSON,init(from decoder:)
方法甚至没有被调用,所以你需要在初始化器的范围之外处理错误。
一种可能的解决方案是在 JSONDecoder.decode(Response.self,from:)
方法的 catch 块中处理错误。一旦 decode
函数抛出错误,您可以检查错误是否是由于输入不正确(在这种情况下很可能意味着输入是一个简单的字符串而不是 JSON)并且您可以简单地将响应数据转换为 String
,然后调用 Response
的成员初始化程序以使用字符串响应对其进行初始化。
以下示例展示了如何使用两个示例响应来处理这种情况,一个是有效的 JSON,另一个是简单的字符串。
let validJsonResponseData = """
{"message" : "A message"}
""".data(using: .utf8)!
let simpleTextResponseData = "Error".data(using: .utf8)!
struct Response: Decodable {
let message: String
}
do {
let successResponse = try JSONDecoder().decode(Response.self, from: validJsonResponseData)
let errorResponse = try JSONDecoder().decode(Response.self, from: simpleTextResponseData)
} catch {
if let error = error as? DecodingError {
switch error {
case .dataCorrupted(_):
if let simpleTextResponse = String(data: simpleTextResponseData, encoding: .utf8) {
let errorResponse = Response(message: simpleTextResponse)
}
default:
throw error
}
} else {
throw error
}
}