Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何将嵌套数组添加到模型类_Json_Swift3_Swifty Json - Fatal编程技术网

Json 如何将嵌套数组添加到模型类

Json 如何将嵌套数组添加到模型类,json,swift3,swifty-json,Json,Swift3,Swifty Json,我从API得到以下响应。我需要在swift 3中对响应进行建模。 JSON中的Api响应如下: { "data": [ { "CategoryName": "אהבה", "CategoryID": "61", "CategoryDate": "2016-08-26 02:11:43", "CategoryImage": "love.png", "SubCategoryArray": [ {

我从API得到以下响应。我需要在swift 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"
            },
我将它存储为

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

唯一的问题是如何为
子类别
类和
文本数组
类执行此操作。

首先,我建议将变量名小写

另外,我会将
textary
类重命名为
Text
,将
SubCategoryArray
类重命名为
SubCategory
,因为它们不是数组,而且名称可能会非常误导

最后,让我们将
子类别数组
文本数组
初始化为
子类别
文本
的空数组,而不是可选数组。这样,无论您将来何时使用它,您都不必运行
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()        

}

写一个单元测试?或者你的意思是什么?很抱歉这个荒谬的问题,我使用了分隔符,如果让subCategoryArray=subCategoryArray{//lets迭代原始数据subCategoryArray.forEach({(subCategoryCandidate))in,并且存储的值是nilsubCategoryArray:content[“subCategoryArray”]as[[String:AnyObject]])。我在这里得到一个警告,从JSON转换为不相关的类型[[String:AnyObject]]总是失败。我将在几分钟后看一看这与您使用SwiftyJSON有关。您需要得到一个字典数组。它应该类似于内容[“subcategory array”].array。我正在查看SwiftyJSON文档,将返回确切的解决方案。为什么不使用ObjectMapper而不是SwiftyJSON?
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()