gpt4 book ai didi

对表示为数组的对象的 Swift Codable 支持

转载 作者:行者123 更新时间:2023-11-30 10:42:46 28 4
gpt4 key购买 nike

我正在尝试对来自将对象表示为字符串数组的 API 的数据进行编码和解码,例如:

[
["username", "message", "date"],
["username", "message", "date"],
["username", "message", "date"]
]

这是相应的可编码结构:

struct Message: Codable {
let user: String
let content: String
let date: String

private enum CodingKeys: Int, CodingKey {
case user = 0
case content = 1
case date = 2
}
}

编码或解码都不起作用;编码显示创建的是 JSON 对象而不是数组:

let msg = Message(user: "foo", content: "content", date: "2019-06-04")

let jsonData = try! JSONEncoder().encode(msg)
let jsonString = String(data: jsonData, encoding: .utf8)!

最终的字符串是:

{"content":"content","user":"foo","date":"2019-06-04"}

我的目标是获取以下字符串

["foo", "content", "2019-06-04"]

在结构中使用自定义编码/解码方法可以解决此问题,但会强制为每个结构/类创建大量样板。

init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let values = try container.decode([String].self)
user = values[CodingKeys.user.rawValue]
content = values[CodingKeys.content.rawValue]
date = values[CodingKeys.date.rawValue]
}

对于任何对象,人们将如何继续支持这一点?

是的,这是一个奇怪的 API,但这不是我第一次遇到其中一个,并且用户不同的 API 格式并不是我在这里寻找的。

最佳答案

singleValueContainer 使用 unkeyedContainer 相比,它更加健壮。如果要将数组项分配给结构成员,则无论如何都必须编写自定义初始值设定项

struct Message: Codable {
let user: String
let content: String
let date: String

init(from decoder: Decoder) throws {
var arrayContainer = try decoder.unkeyedContainer()
guard arrayContainer.count == 3 else { throw DecodingError.dataCorruptedError(in: arrayContainer, debugDescription: "The array must contain three items") }
user = try arrayContainer.decode(String.self)
content = try arrayContainer.decode(String.self)
date = try arrayContainer.decode(String.self)
}

func encode(to encoder: Encoder) throws {
var arrayContainer = encoder.unkeyedContainer()
try arrayContainer.encode(contentsOf: [user, content, date])
}
}

关于对表示为数组的对象的 Swift Codable 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56441866/

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