Разбор многоуровневого JSON с Codable - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь разобрать следующие JSON в tableView: https://www.pathofexile.com/api/trade/data/items

Мне удалось проанализировать первый массив, но я не могу разобрать ключ "записи" ...

Вот мой код со структурой данных, которую я определил:


import UIKit

struct ItemCategories: Codable {
    var result: [ItemCategory]
}

struct ItemCategory: Codable {
    var label: String
    var entries: [Item]
}

struct Item: Codable {
    // empty struct
}

class ViewController: UITableViewController {

    let urlString = "https://www.pathofexile.com/api/trade/data/items"
    var categories = [ItemCategory]()

    override func viewDidLoad() {
        super.viewDidLoad()
        title = "Path of Data"
        navigationController?.navigationBar.prefersLargeTitles = true
        parse()
    }

    func parse() {
        guard let url = URL(string: urlString) else { return }
        guard let data = try? Data(contentsOf: url) else { return }
        let decoder = JSONDecoder()
        guard let jsonItemCategories = try? decoder.decode(ItemCategories.self, from: data) else { return }
        categories = jsonItemCategories.result
        tableView.reloadData()
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return categories.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        var categoryName = categories[indexPath.row].label
        if categoryName == "" { categoryName = "Unknown" }
        cell.textLabel?.text = categoryName
        cell.textLabel?.textColor = .systemOrange
        let numberOfItemsInCategory = String(categories[indexPath.row].entries.count)
        cell.detailTextLabel?.text = numberOfItemsInCategory + " items"
        return cell
    }
}

Структура Item пуста, потому что, когда я пытаюсь добавить переменную, соответствующую введите JSON, после чего весь синтаксический анализ завершится неудачно (tableView ничего не отображает).

Когда структура Item пуста, анализ выполняется успешно, и tableView может отображать различные категории. Он даже отображает количество элементов для каждой «записи» благодаря:

let numberOfItemsInCategory = String(categories[indexPath.row].entries.count)
cell.detailTextLabel?.text = numberOfItemsInCategory + " items"

Может кто-нибудь объяснить, почему? В идеале я хотел бы отображать содержимое «записей», когда строки постукивают, но я не могу понять, как на данный момент.

Спасибо за помощь :)

снимок экрана

1 Ответ

0 голосов
/ 27 февраля 2020

@ Laurent Delorme Your Struct Item должно быть как показано ниже, попробуйте с этим,

    struct Item: Codable {

    let name: String?

    let type: String?

    let text: String?

    let flags: FlagsRepresentation?

    enum CodingKeys: String, CodingKey {

        case name
        case type
        case text
        case flags
    }
}

struct FlagsRepresentation: Codable {

    let unique: Bool?

    enum CodingKeys: String, CodingKey {

        case unique
    }
}
...