Ananda

基于 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"])

Swift 宏

使用 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,从而节省您的时间。

Ducky Model Editor

Ducky Model Editor