【问题标题】:Can't create an object with JSON response from API call无法使用来自 API 调用的 JSON 响应创建对象
【发布时间】:2017-09-14 16:51:17
【问题描述】:

我已进行 API 调用以将我的用户登录到应用程序中。我正在使用 AlamofireSwiftyJSON。 API 调用效果很好,我得到了一个像这样的JSON 文件:

{
    "code": 200,
    "message": "OK",
    "data": {
         "user_id": 1,
         "user_email": "test",
         "user_username": "kk1",
    }
}

为了将用户信息保存在UserDefault 中,我想用这个JSON 响应创建我的用户对象。这是模型

class LFUser: NSObject {

    var user_id: Int?
    var user_email: String?
    var user_username: String?

    init(dict: [String: AnyObject]){
        super.init()
        user_id = dict["user_id"] as? Int
        user_email = dict["user_email"] as? String
        user_username = dict["user_username"] as? String
    }
}

这是API调用和创建对象时登录功能的一部分:

func login(userEmail: String, userPassword: String, finished: @escaping(_ status:String,_ data: LFUser?)-> ()) {

            if let value = response.result.value {

            let dict = JSON(value)
            let code = dict["code"].intValue
            let message = dict["message"].stringValue



            if let data = dict["data"].dictionary {

                print(data)
                let user = LFUser(dict: data as [String : AnyObject])
                print(user.user_email)
                finished("Success", user)

        }
    }

print(data) 运行良好,但创建对象时出现问题,print(user.user_email) 显示 nil。

【问题讨论】:

标签: ios json swift alamofire


【解决方案1】:

请检查:

if let data = dict["data"].dictionary {
    let user = LFUser(dict: data)
    print(user.user_email)
    finished("Success", user)
}


class LFUser: NSObject {

    var user_id: Int?
    var user_email: String?
    var user_username: String?

    init(dict: [String : SwiftyJSON.JSON]){
        super.init()
        user_id = dict["user_id"]?.intValue
        user_email = dict["user_email"]?.stringValue
        user_username = dict["user_username"]?.stringValue
    }
}

【讨论】:

  • 你是对的,这是因为模型中的 [String: Any]。泰
【解决方案2】:

我会选择 Swift 4 的 Codable

struct User: Codable {
    let user_id: Int
    let user_email: String
    let user_username: String
}

struct Response: Codable {
    let code: Int
    let message: String
    let data: User
}

然后你可以像这样解码传入的数据:

let response = try JSONDecoder().decode(Response.self, from: jsonData)

然后,为了将值保存为用户默认值,您可以使用JSONEncoderPropertyListEncoder 将值编码为Data

【讨论】:

  • 有趣,我会尽快检查。非常喜欢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 2017-02-10
  • 2017-10-12
  • 2022-07-30
  • 2021-05-27
  • 1970-01-01
  • 2011-07-11
相关资源
最近更新 更多