基于 yyjson 的 JSON 模型解码。
考虑以下 JSON
{
"profile": {
"nickname": "NIX",
"username": "@nixzhu@mastodon.social",
"avatar_url": "https://files.mastodon.social/accounts/avatars/109/329/064/034/222/219/original/371901c6daa01207.png"
},
"toots": [
{
"id": 1,
"content": "Hello World!",
"created_at": "1674127714"
},
{
"id": 2,
"content": "How do you do?",
"created_at": "1674127720"
}
]
}
我们可以创建遵循 AnandaModel
协议的模型,如下所示
import Foundation
import Ananda
struct Mastodon: AnandaModel {
let profile: Profile
let toots: [Toot]
init(json: AnandaJSON) {
profile = .decode(from: json.profile)
toots = json.toots.array().map { .decode(from: $0) }
}
}
extension Mastodon {
struct Profile: AnandaModel {
let nickname: String
let username: String
let avatarURL: URL
init(json: AnandaJSON) {
username = json.username.string()
nickname = json.nickname.string()
avatarURL = json.avatar_url.url()
}
}
}
extension Mastodon {
struct Toot: AnandaModel {
let id: Int
let content: String
let createdAt: Date
init(json: AnandaJSON) {
id = json.id.int()
content = json.content.string()
createdAt = json.created_at.date()
}
}
}
要解码一个 Mastodon
实例,请使用以下代码
let mastodon = Mastodon.decode(from: jsonString)
或者
let mastodon = Mastodon.decode(from: jsonData)
如果您只想解码 JSON 的特定部分,例如 profile
,请按如下方式指定 path
let profile = Mastodon.Profile.decode(from: jsonData, path: ["profile"])
要解码 toots
数组,请使用以下代码
let toots = [Mastodon.Toot].decode(from: jsonData, path: ["toots"])
使用 AnandaMacros,您可以使用宏来消除对初始化方法的需求,如下所示
import Foundation
import Ananda
import AnandaMacros
@AnandaInit
struct Mastodon: AnandaModel {
let profile: Profile
let toots: [Toot]
}
extension Mastodon {
@AnandaInit
struct Profile: AnandaModel {
let nickname: String
let username: String
@AnandaKey("avatar_url")
let avatarURL: URL
}
}
extension Mastodon {
@AnandaInit
struct Toot: AnandaModel {
let id: Int
let content: String
@AnandaKey("created_at")
let createdAt: Date
}
}
简单而干净,对吧?
请参阅 AnandaBenchmark。
您可以使用 Ducky Model Editor 从 JSON 生成 AnandaModel,从而节省您的时间。