2017-01-18 55 views
1

我從API獲取以下響應。我需要在迅速3. 響應到班JSON API響應是如下模式:如何將嵌套數組添加到我的模型類

{ 
    "data": [ 
    { 
     "CategoryName": "אהבה", 
     "CategoryID": "61", 
     "CategoryDate": "2016-08-26 02:11:43", 
     "CategoryImage": "love.png", 
     "SubCategoryArray": [ 
     { 
      "SubCategoryName": "אהבה", 
      "SubCategoryRefID": "61", 
      "SubCategoryID": "115", 
      "SubCategoryDate": "2016-08-29 09:25:56", 
      "TextArray": [ 
      { 
       "TextID": "103", 
       "Text": "<p dir=\"rtl\"><span style=\"font-size:48px\"><strong>אוהב</strong> אותך כל כך</span></p>\r\n" 
      }, 

我如何子類別和子類TextArray模型。

我使用SwiftyJSON來填充我的模型類

我的模型類,如下圖所示;

class Menu 
{ 
    var CategoryName: String? 
    var CategoryID: String? 
    var CategoryDate: String? 
    var CategoryImage: String? 
    var SubCategoryArray: [SubCategoryArray]? 

    init(CategoryName: String?, CategoryID: String?, CategoryDate: String?, CategoryImage: String?, SubCategoryArray: [SubCategoryArray]?) { 
     self.CategoryName = CategoryName 
     self.CategoryID = CategoryID 
     self.CategoryDate = CategoryDate 
     self.CategoryImage = CategoryImage 
     self.SubCategoryArray = SubCategoryArray 
    } 
} 


class SubCategoryArray 
{ 
    var SubCategoryName: String? 
    var SubCategoryRefID: String? 
    var SubCategoryID: String? 
    var SubCategoryDate: String? 
    var TextArray : [TextArray]? 
    init(SubCategoryName: String?, SubCategoryRefID: String?, SubCategoryID: String?, SubCategoryDate: String?, TextArray: [TextArray]?) { 
     self.SubCategoryName = SubCategoryName 
     self.SubCategoryRefID = SubCategoryRefID 
     self.SubCategoryID = SubCategoryID 
     self.SubCategoryDate = SubCategoryDate 
     self.TextArray = TextArray 
    } 
} 


class TextArray 
{ 
    var TextID: String? 
    var Text: String? 

    init (TextID:String? , Text: String?) 
    { 
     self.TextID = TextID 
     self.Text = Text 
    } 
} 

我把它作爲

if let json = try? JSON(result){ 
var menus = [Menu]()      
for (_, content) in json["data"] { 
let menu = Menu(CategoryName: (content["CategoryName"].string), 
CategoryID: content["CategoryID"].string, 
CategoryDate: content["CategoryDate"].string, 
CategoryImage: content["CategoryImage"], 
SubCategoryArray: content["SubCategoryArray"].string) 
menus.append(menu) 
} 

唯一的問題是如何做到這一點的SubCategory類和TextArray類。

+0

爲什麼不改用ObjectMapper swiftyjson的? –

回答

2

首先,我會建議小寫變量名稱。

此外,我會將TextArray類重新命名爲Text,SubCategoryArray類到SubCategory,因爲它們不是數組,名稱可能非常具有誤導性。

最後,讓初始化subCategoryArraytextArray作爲SubCategoryText空數組,而不是被任選的。這樣,無論您將來何時使用它,您都不必運行nil檢查,只需檢查是否isEmpty

你需要做的只是迭代傳入的對象,並創建你的數組。請看下面的代碼。

class Menu { 
    var categoryName: String? 
    var categoryID: String? 
    var categoryDate: String? 
    var categoryImage: String? 
    var subCategoryArray = [SubCategory]() 

    init(categoryName: String?, categoryID: String?, categoryDate: String?, categoryImage: String?, subCategoryArray: [Any]?) { 
     self.categoryName = categoryName 
     self.categoryID = categoryID 
     self.categoryDate = categoryDate 
     self.categoryImage = categoryImage 

     // lets check if SubCategoryArray is not nil 
     if let subCategoryArray = subCategoryArray as? [[String: AnyObject]] { 
      // lets iterate on the raw data 
      subCategoryArray.forEach({ (subCategoryCandidate) in 
       // Create category 
       let subcategory = SubCategory(subCategoryName: subCategoryCandidate["SubCategoryName"] as? String, 
        subCategoryRefID: subCategoryCandidate["SubCategoryRefID"] as? String, 
        subCategoryID: subCategoryCandidate["SubCategoryID"] as? String, 
        subCategoryDate: subCategoryCandidate["SubCategoryDate"] as? String, 
        textArray: subCategoryCandidate["TextArray"] as? [[String: AnyObject]]) 
       // Append to our array 
       self.subCategoryArray.append(subcategory) 
      }) 
     } 
    } 
} 

// lets rename this class only to SubCategory, because this is not an array at all 
class SubCategory { 
    var subCategoryName: String? 
    var subCategoryRefID: String? 
    var subCategoryID: String? 
    var subCategoryDate: String? 
    var textArray = [Text]() 
    init(subCategoryName: String?, subCategoryRefID: String?, subCategoryID: String?, subCategoryDate: String?, textArray: [[String: AnyObject]]?) { 
     self.subCategoryName = subCategoryName 
     self.subCategoryRefID = subCategoryRefID 
     self.subCategoryID = subCategoryID 
     self.subCategoryDate = subCategoryDate 

     if let textArray = textArray { 
      textArray.forEach({ (textArrayCandidate) in 
       let text = Text(textID: textArrayCandidate["TextID"] as? String, text: textArrayCandidate["Text"] as? String) 
       self.textArray.append(text) 
      }) 
     } 
    } 
} 

// Rename this to Text, because this is also not an array 
class Text { 
    var textID: String? 
    var text: String? 

    init(textID:String? , text: String?) { 
     self.textID = textID 
     self.text = text 
    } 
} 

用法

let url = URL(string: "YOUR-URL") 
let request = URLRequest(url: url!) 
let config = URLSessionConfiguration.default 
let session = URLSession(configuration: config) 

let task = session.dataTask(with: request, completionHandler: {(data, response, error) in 
    if let data = data, let json = try? JSON(data) { 

     var menus = [Menu]()      
     for (_, content) in json["data"] { 
      let menu = Menu(categoryName: (content["CategoryName"].string), 
          categoryID: content["CategoryID"].string, 
          categoryDate: content["CategoryDate"].string, 
          categoryImage: content["CategoryImage"].string, 
          subCategoryArray: content["SubCategoryArray"].arrayObject) 
      menus.append(menu) 
     } 

     print(menus) // prints 6 items for me 
    } 
}); 
task.resume()   

}

+0

通過寫一個單元測試可能嗎?或者你是什麼意思? – dirtydanee

+0

對不起,這個荒謬的問題好吧,我使用休息和這部分的代碼跳過,如果讓subCategoryArray = subCategoryArray {0128} –

+0

BTW非常感謝 –

相關問題