如何在 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_id
、user_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)
}
我有一个 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_id
、user_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)
}