Как анализировать данные с помощью Alamofire, когда родитель и ребенок имеют одинаковые данные? - PullRequest
0 голосов
/ 07 ноября 2018

Я использую Alamofire для вызова и анализа данных json, но проблема в том, что ответ не верный. parent и child имеют одинаковые данные, поэтому парсер изменил идентификаторы при разборе, и количество элементов уменьшилось. Данные ниже - это 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)
        }
    }
}

1 Ответ

0 голосов
/ 07 ноября 2018

Попробуйте, вы должны использовать Codable, поскольку это делает это намного проще. При построении этих структур родительская структура просматривает данные, используя постоянное имя, поэтому, например, пусть id, вы получите часть данных «id». Затем я построил другую структуру, так что когда она проходит через дочерние элементы, она будет делать то же самое внутри, используя эту структуру.

  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

и для ребенка:

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

Я не уверен, как вам нужны данные, так что вы можете возиться с тем, как вы обрабатываете массивы, и я не смог протестировать, но это должно быть в этом духе.

Помните, что в структурах вам нужно использовать ?, если возможно, что значение будет нулевым. Этот метод также не использует Alamofire или SwiftyJSON, так как Codable делает его намного более быстрым и удобным для выполнения подобных задач с использованием структур.

...