Swift 5:JSON的处理和解码错误



我正在运行一个服务,当我遇到错误时,它应该向我显示来自后端的错误消息。到目前为止,我已经这样做了,而且效果很好。

然而,我想知道是否可以解析枚举中的返回错误,或者类似的东西,这样我就不必调用response.errors.result……但我不知道如何在出现错误时稍后获取来自返回的消息字符串。

另一方面,我有一个问题,当服务中的可选值为nil时,是否可以不使用默认值。我指的是我必须执行的情况??错误突变(代码:10,消息:"错误"(。如果存在一种我不必传递默认值的方式。

struct ResponseData: Codable {
let data: Data?
let errors: Errors?
}

struct Data: Codable {
let result: Mutation?
}

struct Mutation: Codable {
let id: String?
let active: Bool?
}

struct Errors: Codable, Error {
let result: [ErrorMutation]?
}

struct ErrorMutation: Codable, Error {
let code: Int?
let message: String?
}

final class MutationManager: Service {
func getTDMutation() -> Observable<Result<Mutation, ErrorMutation>> {
let mutationQuery = Bundle.main.value ?? ""
let body = ["query": "mutation (mutationQuery)"]
return response(body: body)
.map {
try JSONDecoder().decode(ResponseData.self, from: $0) }
.flatMap { response -> Observable<Result<Mutation, ErrorMutation>> in
guard response.data != nil else {
let error = response.errors?.result.first
return .just(.failure(error ?? ErrorMutation(code: 10, message: "error")))
}
return .just(.success(response.data?.result ?? Mutation(id: "", active: false)))
}
}
}

使用Codable进行解析,您必须像这样重写ResponseData类和Dataclass的代码。

struct ResponseData: Codable {
let dataMutation: DataMutation?
let errors: Errors?
private enum CodingKeys : String, CodingKey {
case errors, dataMutation = "data"
}
}
struct DataMutation: Codable {
let result: Mutation?
}

相关内容

  • 没有找到相关文章

最新更新