无法解析通用Codable

时间:2018-08-30 10:37:16

标签: json swift codable

我正在使用通用编码来传递网络响应。我创建了下面的函数,该函数解码数据并返回结果:

以下是该功能的一部分:

 guard let jsonDataUnwrapped = jsonData,
                  let result: ServerResponse<T> = try? JSONDecoder().decode(ServerResponse<T>.self, from: jsonDataUnwrapped) else {
                completionHandler(.error(APIError.init(type: .parsingError)))
                return
            }

ServerResponse中的代码:

struct ServerResponse<T: Codable> : Codable {
    var response: T
    var errors: [ServerError]
}

struct ServerError : Codable {
    var code: Int
    var message: String
}

在可编码类中,我正在这样做:

init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        email = try values.decodeIfPresent(String.self, forKey: .email)
        firstName = try values.decodeIfPresent(String.self, forKey: .firstName)
        lastName = try values.decodeIfPresent(String.self, forKey: .lastName)
        phoneNumber = try values.decode(String.self, forKey: .phoneNumber)
        if let status = try values.decodeIfPresent(String.self, forKey: .accountStatus) {
            accountStatus = UserStatus(rawValue: status)!
        }
    }

当我在响应键中获取数据时,此代码可以正常工作。但是在某些情况下,我也会得到空的响应密钥并出现一些错误:

{
    "response": {},
    "errors": [
        {
            "code": "104",
            "message": "Authentication failed"
        }
    ]
}

当我收到空响应时,我需要错误数组,但我无法获取。

1 个答案:

答案 0 :(得分:1)

如果您还添加了所收到的错误消息,那将非常有帮助,但是查看代码很明显

  

打算对Int进行解码,但是找到了一个字符串/数据。

在JSON中,双引号中的所有内容都是String甚至"104""false"

struct ServerError : Codable {
    let code: String
    let message: String
}

这与问题无关,但是将结构成员声明为常量(let),因为您不会对其进行突变。