如何在Swift 4中的NSObject类中初始化json中的数组?

时间:2018-02-09 08:21:13

标签: json swift4 nsobject swifty-json

我有一个JSON格式的API响应,如下所示:

item_id

我知道如何在上面的结果中解析user_idliked_user和其他人的结果。但是如何在上面的响应中获取class Item : NSObject { var itemtId :Int var userId : Int var luckyNumber : Int var itemCreatedAt : String init?(dict: [String :JSON]) { self.itemId = dict["item_id"]?.int ?? 0 self.userId = dict["user_id"]?.int ?? 0 self.luckyNumber = dict["lucky_number"]?.int ?? 0 self.itemCreatedAt = dict["modified_time"]?.string ?? "" } } 的结果,这是一个数组?

现在我的NSObject类看起来像这样:

var items = [Item]()

My ApiCall success ....  {

    let json = JSON(result) // this is SwiftyJson
    guard let itemArr = json["item"].array else{
        return
    }

    for item in itemArr {
        if let item = item.dictionary,let feed = Item.init(dict: item){
            self.items.append(feed)
    }

}

然后在我进行API调用之后,我会像这样解析对这个类的响应:

liked_user

所以我的问题是,在这种情况下,我如何解析Item中的数据并将其存储在我的var email = nodemailer.createTransport("STMP", { service: "Sendgrid", auth: { user: "username", pass: "pass" } }) 类中?

3 个答案:

答案 0 :(得分:3)

使用您给定的代码,解决方案是在类

中创建数组likedUserIDs
class Item : NSObject {
    var itemtId :Int
    var userId : Int
    var luckyNumber : Int
    var itemCreatedAt : String
    var likedUserIDs = [Int]()

    init?(dict: [String :JSON]) {
        self.itemId = dict["item_id"]?.int ?? 0
        self.userId = dict["user_id"]?.int ?? 0
        self.luckyNumber = dict["lucky_number"]?.int ?? 0
        self.itemCreatedAt = dict["modified_time"]?.string ?? ""
        if let likedUsers = dict["liked_user"]?.array {
           for likedUser in likedUsers {
               likedUserIDs.append(likedUser["user_id"].intValue)
           }
        }
    }
}

但是在Swift 4中,我建议使用(De)Codable协议并使用结构来解析JSON。

SwiftyJSON不再需要了。

struct Root : Decodable {
    let item : [Item]
}

struct Item : Decodable {
    let itemId :Int
    let userId : Int
    let luckyNumber : Int
    let itemCreatedAt : String
    let likedUsers : [LikedUser]

    private enum CodingKeys : String, CodingKey {
        case itemId = "item_id"
        case userId = "user_id"
        case luckyNumber = "lucky_number"
        case itemCreatedAt = "modified_time"
        case likedUsers = "liked_user"
    }

    struct LikedUser : Decodable {
        let userID : Int
        private enum CodingKeys : String, CodingKey { case userID = "user_id" }
    }
}

解码它将原始JSON传递为Data对象

do {
    let result = try decoder.decode(Root.self, from: data)
    print(result)
} catch {
    print("error: ", error)
}

答案 1 :(得分:0)

我认为liked_user的结果是一个包含两个Json对象的数组。 下面的代码块将对您有所帮助。

let liked_users = json["liked_user"].array
for liked_user in liked_users {
    let user_id = liked_user["user_id"].int
}

您可以将user_id保存到Item类中的数组中。

class Item : NSObject {
    var itemId :Int
    var userId : Int
    var luckyNumber : Int
    var itemCreatedAt : String
    var useridArray: [Int] = []

    init?(dict: [String :JSON]) {
        self.itemId = dict["item_id"]?.int ?? 0
        self.userId = dict["user_id"]?.int ?? 0
        self.luckyNumber = dict["lucky_number"]?.int ?? 0
        self.itemCreatedAt = dict["modified_time"]?.string ?? ""
        if let liked_users = dict["liked_user"]?.array { 
            for liked_user in liked_users {
                if let userid = liked_user["user_id"]?.int {
                    useridArray.append(userid)
                }
            }
        }
    }

}

答案 2 :(得分:0)

在Item对象中创建一个likesUsersArray var,然后以这种方式解析字典数组:

 class Item : NSObject {
    var itemtId :Int
    var userId : Int
    var luckyNumber : Int
    var itemCreatedAt : String
    var likedUsersArray: [Int] = []

    init?(dict: [String :JSON]) {
        self.itemId = dict["item_id"]?.int ?? 0
        self.userId = dict["user_id"]?.int ?? 0
        self.luckyNumber = dict["lucky_number"]?.int ?? 0
        self.itemCreatedAt = dict["modified_time"]?.string ?? ""
        for likedUserDict in dict["liked_user"]?.array {
            if let dict = likedUserDict?.dictionary, let likedUserId = dict["user_id"].int {                    
                self.likedUsersArray.append(likedUserId)
            }
        }
    }
}