我正在尝试用AlamoFire5.2解码一个json请求,问题是我使用了JSONDecoder,并且我对转换有一些问题
API是西班牙语的,我的模型是英语的,所以我决定使用键枚举来更改这种值。
但我不知道这是否有效..。这是我的密码:
API响应:(json变量)
{
"sistemaOperativoId" : 0,
"nombreUsuario" : "Coasnf_09",
"menus" : [
],
"acciones" : [
],
"fechaRegistro" : "2020-04-15T09:46:24.0573154",
"empresa" : null,
"version" : null
}我的模特:
struct UserP: Decodable{
var username : String
var company : String
private enum CodingKeys: String, CodingKey{
case username = "nombreUsuario"
case company = "empresa"
}
init(from decoder: Decoder) throws{
let container = try decoder.container(keyedBy: CodingKeys.self)
username = try container.decode(String.self, forKey: .username) ?? "null"
company = try container.decode(String.self, forKey: .company) ?? "null"
}
init(username: String, company: String){
self.username = username
self.company = company
}
}协调:
func login(user: User) -> UserP? {
var userData: UserP! = nil
AF.request(UserRouter.login(user: user)).responseJSON{ response in
switch response.result {
case .success(let response):
print(response)
let dict = (response as? [String : Any])!
let json = dict["data"] as! [String: Any]
if let jsonData = try? JSONSerialization.data(withJSONObject: json , options: .prettyPrinted)
{
do {
var jsonString = String(data: jsonData, encoding: String.Encoding.utf8)!
print(jsonString)
userData = try JSONDecoder().decode(UserP.self, from: Data(jsonString.utf8))
print("Object Converted: ", userData.username)
} catch {
print("Parsing Failed: ", error.localizedDescription)
}
}
break
case .failure(let error):
print(error)
break
}
}
return userData
}发布于 2020-04-17 19:31:30
与阿拉莫火逻辑有关的变化:
response from Alamofire有一个data属性,可以直接使用:
let json = response.data
do {
let user = try JSONDecoder().decode(UserP.self, from: json)
print(user)
}
catch {
print(error)
}如果键nombreUsuario和empresa不能保证在json中出现,那么推荐的方法是将这些变量标记为可选的。这样您就不需要定制的解码器逻辑了。
模型更改#1:
struct UserP: Decodable {
var username: String?
var company: String?
private enum CodingKeys: String, CodingKey{
case username = "nombreUsuario"
case company = "empresa"
}
}模型更改#2:
如果您想给出一些默认值,那么自定义解码器可以帮助:
struct UserP: Decodable {
var username: String
var company: String
private enum CodingKeys: String, CodingKey{
case username = "nombreUsuario"
case company = "empresa"
}
init(from decoder: Decoder) throws{
let container = try decoder.container(keyedBy: CodingKeys.self)
username = try container.decodeIfPresent(String.self, forKey: .username) ?? "Default Name"
company = try container.decodeIfPresent(String.self, forKey: .company) ?? "Default Company Name"
}
}https://stackoverflow.com/questions/61278702
复制相似问题