解析更复杂的嵌套响应

时间:2018-04-26 19:53:54

标签: json swift xcode jsondecoder

我正在尝试解析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 :(得分:1)

您的代码可以在Playground中以最少的调整运行,如下所示:

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) )配置)。