Swift 将可解析结构转换为可编码结构无法按预期工作

Swift 将可解析结构转换为可编码结构无法按预期工作,swift,codable,Swift,Codable,我想使用现在可以解析的codable解析来自服务的响应。目前的结构是
如下 { "service": { "categories": [ { "categoryName": "category1", "fullName": "Federico", "id": "12345", "phone": "9787678684" } ], "type":

我想使用现在可以解析的codable解析来自服务的响应。目前的结构是
如下

{
    "service": {
        "categories": [
        {
        "categoryName": "category1",
        "fullName": "Federico",
        "id": "12345",
        "phone": "9787678684"
        }
        ],
        "type": "type"
    }
}
我的问题是,我没有收到服务器发送的错误消息,错误消息的格式如下



{
   errorType: “some errorType”,
   errorMessage: “some error message”
}

我如何制作满足这些条件的可编码模型?

您可以这样做:

struct General: Decodable {
 let service: Service?
 let error: Error?
}
struct Service: Decodable {
 let categories: [Categories]
 let type: String
}
struct Categories: Decodable {
 let categoryName,fullName,id,phone: String
}
struct Error: Decodable {
 let errorType,errorMessage: String
}
现在,您可以检查是否存在错误

guard let json = try? JSONDecoder().decode(General.self,from: data) else { print("Unable to parse response"); return }
if json.error.isEmpty {
//Show error
} else {
//Do your stuff
}

如果您在成功和失败的情况下得到不同的JSON响应,您需要创建两个模型

1。成功模式

struct Root: Decodable {
    let service: Service
}

struct Service: Decodable {
    let categories: [Category]
    let type: String
}

struct Category: Decodable {
    let categoryName, fullName, id, phone: String
}
struct Error: Decodable {
    let errorType: String
    let errorMessage: String
}
2。错误模型

struct Root: Decodable {
    let service: Service
}

struct Service: Decodable {
    let categories: [Category]
    let type: String
}

struct Category: Decodable {
    let categoryName, fullName, id, phone: String
}
struct Error: Decodable {
    let errorType: String
    let errorMessage: String
}
现在,解析JSON
数据
就像这样

do {
    let response = try JSONDecoder().decode(Root.self, from: data)
    print(response)
} catch {
    let error = try JSONDecoder().decode(Error.self, from: data)
    print(error)
}

一个合理的解决方案是一个带有关联类型的枚举,其好处是您摆脱了可选项

enum Response : Decodable {

    case success(Service)
    case failure(ResponseError)

    init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        do {
            let responseData = try container.decode(Service.self)
            self = .success(responseData)
        } catch DecodingError.typeMismatch {
            let errorData = try container.decode(ResponseError.self)
            self = .failure(errorData)
        }
    }
}

struct Service : Decodable {
    let categories : [Category]
}

struct ResponseError : Decodable {
    let errorType, errorMessage : String
}

struct Category : Decodable {
    ...
}
并使用它

do {
    let result = try JSONDecoder().decode(Response.self, from: data)
    switch result {
        case .success(let service): print(service)
        case .failure(let error): print(error)
    }
} else {
    print(error)
}

你能给我们看一下JSON的代码吗?另外,请告诉我们到目前为止您尝试了什么。我已经用示例json更新了我的问题。您能告诉我您创建的当前模型吗?