【问题标题】:Parse More Complex Nested Response解析更复杂的嵌套响应
【发布时间】:2018-04-26 19:53:53
【问题描述】:

我正在尝试解析 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”的名称有错误,但我无法重命名它。

如何解析这些数据?

【问题讨论】:

  • 在 StackOverflow 上提问时,您应该始终努力提供可执行代码,在 Swift 中,这最好作为 Playground 来完成。您还应该打印出您得到的错误,在这种情况下将是 keyNotFound(__lldb_expr_1.PagedCourses.(CodingKeys in _63370E247A5AFC0F0F23D40800403DB3).search_results, Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key search_results (\"search_results\").", underlyingError: nil)) 确认您的怀疑。幸运的是,您可以对此做一些事情,如我的回答所示。

标签: json swift xcode jsondecoder


【解决方案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)
}

事实上,这是CodingKeysenum 的主要用途,它将允许您匹配与您的structs/classes 不“匹配”的键。我仍然钦佩Codable 协议的优雅,它设法以最小的开销和非常易读的语法提供这种灵活性(最重要的是:通过使用简单的可执行文件code 而无需求助于一些混乱的(XML)配置)。

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 2018-07-15
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2021-01-25
    相关资源
    最近更新 更多