解析更复杂的嵌套响应
Parse More Complex Nested Response
我正在尝试解析 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',但我无法重命名。
如何解析这些数据?
您的代码可以 运行 在 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
的主要目的,它将允许您匹配不 "match" 您的 structs
/classes
.我仍然钦佩 Codable
协议的优雅,它设法以最小的开销和非常易读的语法提供这种灵活性(最重要的是:通过使用简单的可执行文件 code
而无需求助于一些混乱的 (XML) 配置).
我正在尝试解析 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',但我无法重命名。
如何解析这些数据?
您的代码可以 运行 在 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
的主要目的,它将允许您匹配不 "match" 您的 structs
/classes
.我仍然钦佩 Codable
协议的优雅,它设法以最小的开销和非常易读的语法提供这种灵活性(最重要的是:通过使用简单的可执行文件 code
而无需求助于一些混乱的 (XML) 配置).