gpt4 book ai didi

arrays - 如何从 Decodable (Swift) 中的数组访问容器

转载 作者:行者123 更新时间:2023-11-28 11:51:50 24 4
gpt4 key购买 nike

我已经尝试了一段时间,但找不到解决这个问题的方法:

我有以下来自 Google Books API 的示例响应:

let json = """
{
"items": [
{
"volumeInfo": {
"title": "Harry Potter und der Stein der Weisen",
"description": "Eigentlich hatte Harry geglaubt, er sei ein ganz normaler Junge. Zumindest bis zu seinem elften Geburtstag. Da erfährt er, dass er sich an der Schule für Hexerei und Zauberei einfinden soll. Und warum? Weil Harry ein Zauberer ist. Und so wird für Harry das erste Jahr in der Schule das spannendste, aufregendste und lustigste in seinem Leben. Er stürzt von einem Abenteuer in die nächste ungeheuerliche Geschichte, muss gegen Bestien, Mitschüler und Fabelwesen kämpfen. Da ist es gut, dass er schon Freunde gefunden hat, die ihm im Kampf gegen die dunklen Mächte zur Seite stehen."
}
}
]
}
""".data(using: .utf8)

此响应永远不会返回超过一项。 (指定为参数)因此可以安全地假设项目只有一个成员/第一个成员是正确的。

为了表示一本书,我创建了这个结构:

struct Book: Decodable {

let title: String
let description: String?

enum OuterOuterCodingKeys: CodingKey {
case items
}

enum OuterCodingKeys: CodingKey {
case volumeInfo
}

enum CodingKeys: String, CodingKey {
case title
case description
}

init(from decoder: Decoder) throws {
let outerOuterContainer = try decoder.container(keyedBy: OuterOuterCodingKeys.self)
}
}

现在这就是我的进展。我现在需要以某种方式从 volumeInfo 中提取项目,但不知道如何进入数组。

感谢您的帮助!

最佳答案

您走在正确的轨道上,但我们可以为您额外的 CodingKey 枚举提供更好的名称,并将它们设为私有(private)。

import Foundation

let jsonData = """
{
"items": [
{
"volumeInfo": {
"title": "Harry Potter und der Stein der Weisen",
"description": "Eigentlich hatte Harry geglaubt, er sei ein ganz normaler Junge. Zumindest bis zu seinem elften Geburtstag. Da erfährt er, dass er sich an der Schule für Hexerei und Zauberei einfinden soll. Und warum? Weil Harry ein Zauberer ist. Und so wird für Harry das erste Jahr in der Schule das spannendste, aufregendste und lustigste in seinem Leben. Er stürzt von einem Abenteuer in die nächste ungeheuerliche Geschichte, muss gegen Bestien, Mitschüler und Fabelwesen kämpfen. Da ist es gut, dass er schon Freunde gefunden hat, die ihm im Kampf gegen die dunklen Mächte zur Seite stehen."
}
}
]
}
""".data(using: .utf8)!

struct Book: Decodable {

let title: String
let description: String?

init(from decoder: Decoder) throws {
let rootContainer = try decoder.container(keyedBy: RootContainerKeys.self)
var itemsContainer = try rootContainer.nestedUnkeyedContainer(forKey: .items)
let itemContainer = try itemsContainer.nestedContainer(keyedBy: ItemKeys.self)
let myContainer = try itemContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: .volumeInfo)
self.title = try myContainer.decode(String.self, forKey: .title)
self.description = try myContainer.decodeIfPresent(String.self, forKey: .description)
}

private enum CodingKeys: String, CodingKey {
case title
case description
}

private enum RootContainerKeys: CodingKey {
case items
}

private enum ItemKeys: CodingKey {
case volumeInfo
}
}

let book = try? JSONDecoder().decode(Book.self, from: jsonData)
print(book)

关于arrays - 如何从 Decodable (Swift) 中的数组访问容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51775846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com