Разбор более сложного вложенного ответа - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь разобрать JSON:

{
  "meta": {
    "page": 1
  },
  "search-results": [
    {
      "id": 41528747
    }
  ]
}

Я определил следующую структуру:

public struct PagedCourses: Codable {

    public struct Meta: Codable {
        public let page: Int

        enum CodingKeys: String, CodingKey {
            case page = "page"
        }
    }

    public struct Course: Codable {
        public let id: Int

        enum CodingKeys: String, CodingKey {
            case id = "id"
        }
    }

    public let meta: Meta
    public let search_results: [Course]
}

Когда я получаю данные, я получаю сообщение об ошибке.

let courses = try? JSONDecoder().decode(PagedCourses.self, from: data)

Я думаю, что ошибка в имени переменной 'search_results', но я не могу ее переименовать.

Как я могу проанализировать эти данные?

1 Ответ

0 голосов
/ 27 апреля 2018

Ваш код может быть запущен с минимальными изменениями на игровой площадке следующим образом:

import Cocoa

let jsonData = """
{
    "meta": {
        "page": 1
    },
    "search-results": [
        {
            "id": 41528747
        }
    ]
}
""".data(using: .utf8)!

public struct PagedCourses: Codable {

    public struct Meta: Codable {
        public let page: Int

        enum CodingKeys: String, CodingKey {
            case page = "page"
        }
    }

    public struct Course: Codable {
        public let id: Int

        enum CodingKeys: String, CodingKey {
            case id = "id"
        }
    }

    public let meta: Meta
    public let searchResults: [Course]

    private enum CodingKeys : String, CodingKey {
        case meta
        case searchResults = "search-results"
    }
}

do {
    let paged = try JSONDecoder().decode(PagedCourses.self, from: jsonData)
    print(paged)
} catch {
    print(error)
}

На самом деле это основная цель CodingKeys enum, она позволяет вам сопоставлять ключи, которые не "соответствуют" вашему structs / classes. Я по-прежнему восхищаюсь элегантностью протокола Codable, который обеспечивает такую ​​гибкость с минимальными издержками и очень удобочитаемым синтаксисом (и, прежде всего: с помощью простого исполняемого файла code, не прибегая к каким-то грязным частям (XML) конфигурации).

...