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

How to initialize array inside json in a NSObject class in Swift 4?

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

{
"item": [
        {
            "item_id": 484,
            "user_id": 123,
            "lucky_number": -1,
            "liked_user": [
                {
                    "user_id": 2
                },
                {
                    "user_id": 1
                }
            ],
            "modified_time": "0000-09-19 10:24:02"
        }

    ]
}

我知道如何解析 item_iduser_id 和结果中的其他结果 above.But 如何在上面的响应中获取 liked_user 的结果,哪个是数组?

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

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 ?? ""
    }

}

然后在我进行 API 调用后,我像这样解析对此 class 的响应:

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)
    }

}

所以我的问题是,在这种情况下,我如何解析 liked_user 中的数据并将其存储在我的 Item class 中?

我认为 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 中的数组。

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)
                }
            }
        }
    }

}

在您的 Item 对象中创建一个 likedUsersArray 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)
            }
        }
    }
}

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

中创建数组 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)
}