gpt4 book ai didi

ios - Swift Codable 将空 json 解码为 nil 或空对象

转载 作者:行者123 更新时间:2023-12-01 23:20:23 26 4
gpt4 key购买 nike

这是我的代码:

class LoginUserResponse : Codable {
var result: String = ""
var data: LoginUserResponseData?
var mess: [String] = []
}

public class LoginUserResponseData : Codable {
var userId = "0"
var name = ""
}

现在,调用服务器 API,我将像这样解析响应(使用 Stuff 库来简化解析):

do {
let loginUserResponse = try LoginUserResponse(json: string)
} catch let error {
print(error)
}

当我输入正确的密码时,我得到如下答案:

{"result":"success","data":{"userId":"10","name":"Foo"},"mess":["You're logged in"]}

这很好,解析器工作正常。

当提供错误密码时给出以下答案:

{"result":"error","data":{},"mess":["Wrong password"]}

在这种情况下,解析器会失败。它应该将数据设置为零,但相反,它尝试将其解码为 LoginUserResponseData 对象。

我在 Android 上使用相同的方法使用改造,效果很好。我不想将所有字段设为可选。

有没有办法让解析器将空 json {} 视为 nil?或者将 LoginUserResponseData 设置为非可选并且它只有默认值?我知道我可以为此创建一个自定义解析器,但我有大量这样的请求,并且需要太多的额外工作。

最佳答案

就这么简单!

class LoginUserResponse : Codable {
var result: String = ""
var data: LoginUserResponseData?
var mess: [String] = []

private enum CodingKeys: String, CodingKey {
case result, data, mess
}

required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
result = try values.decode(String.self, forKey: .result)
mess = try values.decode([String].self, forKey: .mess)
data = try? values.decode(LoginUserResponseData.self, forKey: .data)
}
}

public class LoginUserResponseData : Codable {
var userId = "0"
var name = ""
}

let str = "{\"result\":\"success\",\"data\":{\"userId\":\"10\",\"name\":\"Foo\"},\"mess\":[\"You're logged in\"]}"
let str2 = "{\"result\":\"error\",\"data\":{},\"mess\":[\"Wrong password\"]}"

let decoder = JSONDecoder()
let result = try? decoder.decode(LoginUserResponse.self, from: str.data(using: .utf8)!)
let result2 = try? decoder.decode(LoginUserResponse.self, from: str2.data(using: .utf8)!)
dump(result)
dump(result2)

关于ios - Swift Codable 将空 json 解码为 nil 或空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48943510/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com