首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析失败: JSONDecoder Swift

解析失败: JSONDecoder Swift
EN

Stack Overflow用户
提问于 2020-04-17 18:53:33
回答 1查看 357关注 0票数 1

我正在尝试用AlamoFire5.2解码一个json请求,问题是我使用了JSONDecoder,并且我对转换有一些问题

API是西班牙语的,我的模型是英语的,所以我决定使用键枚举来更改这种值。

但我不知道这是否有效..。这是我的密码:

API响应:(json变量)

代码语言:javascript
复制
    {
  "sistemaOperativoId" : 0,
  "nombreUsuario" : "Coasnf_09",
  "menus" : [

  ],
  "acciones" : [

  ],
  "fechaRegistro" : "2020-04-15T09:46:24.0573154",
  "empresa" : null,
  "version" : null
}

我的模特:

代码语言:javascript
复制
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
    }
}

协调:

代码语言:javascript
复制
   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
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-17 19:31:30

与阿拉莫火逻辑有关的变化:

response from Alamofire有一个data属性,可以直接使用:

代码语言:javascript
复制
let json = response.data
do {
    let user = try JSONDecoder().decode(UserP.self, from: json)
    print(user)
}
catch {
    print(error)
}

如果键nombreUsuarioempresa不能保证在json中出现,那么推荐的方法是将这些变量标记为可选的。这样您就不需要定制的解码器逻辑了。

模型更改#1:

代码语言:javascript
复制
struct UserP: Decodable {
    var username: String?
    var company: String?

    private enum CodingKeys: String, CodingKey{
        case username = "nombreUsuario"
        case company = "empresa"
    }
}

模型更改#2:

如果您想给出一些默认值,那么自定义解码器可以帮助:

代码语言:javascript
复制
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"
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61278702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档