当 parent 和 child 具有相同数据时,如何使用 Alamofire 解析数据?

How to parse data using Alamofire when parent and child have same data?

我正在使用 Alamofire 调用和解析 json 数据,但问题是响应不正确。 parent 和 child 具有相同的数据,因此解析器更改了解析中的 ID,并且项目数量减少了。下面的数据是我想使用模型

解析的 json
{
"error": false,
"message": "",
"data": [
    {
        "id": 1,
        "parent_id": null,
        "name": "Ink Cartridge",
        "notes": null,
        "children": [
            {
                "id": 5,
                "parent_id": 1,
                "name": "Colored",
                "notes": null
            }
        ]
    },
    {
        "id": 2,
        "parent_id": null,
        "name": "Toner Cartridge",
        "notes": null,
        "children": []
    },
    {
        "id": 3,
        "parent_id": null,
        "name": "Combo",
        "notes": null,
        "children": []
    },
    {
        "id": 4,
        "parent_id": null,
        "name": "Combo Set",
        "notes": null,
        "children": []
    }
]

}

我正在使用这个 Alamofire 和 SwiftyJSON 库

Alamofire.request(ServerAPI.getCategories()).responseJSON { (responseData) -> Void in
        if((responseData.result.value) != nil) {
            let swiftyJsonVar = JSON(responseData.result.value!)
            print(swiftyJsonVar)
        }
    }
}

试试这个,你应该使用 Codable,因为它使这更容易。 构建这些结构,parent 结构使用常量名称遍历数据,例如让 id,将为您提供数据的 "id" 部分。然后我构建了另一个结构,这样当它通过 children 时,它会在内部使用该结构做同样的事情。

  struct Parent: Codable {

   let id: Int
   let parent_id: Int?
   let name: String
   let notes: String?
   let children: [Child]?

  }

  struct Child: Codable {

      let id: Int
      let parent_id: Int?
      let name: String
      let notes: String?
  }

然后你需要一个变量来保存这个数据:

 var completeData = [Parent]()

在你的通话中:

      do {
let dataParsed = try JSONDecoder().decode([Parent].self, from: data
 self.completeData = dataParsed

} catch {
print(error)
}

要访问它,您应该能够做到

var accessingID = self.completeData[0].id

并且对于 child:

var accessingChild = self.completeData[0].children.id

我不确定你想要数据的方式,所以你可能想弄乱你处理数组的方式,我还没有能够测试,但应该是这样的。

请记住,如果该值可能为空,您需要在结构中使用 ?。此方法也不使用 Alamofire 或 SwiftyJSON,因为 Codable 使得使用结构来做这种事情变得更加快捷和方便。