使用带有变量的json解析的扩充结构

gwbalxhn  于 2022-10-23  发布在  Swift
关注(0)|答案(1)|浏览(163)

我有一些可以用JSONDecoder解析的“徽章”列表的静态数据。我想添加一个不在json数据中的状态,当我将变量添加到Badge结构中时,解析失败。
然后,我尝试创建两个不同的结构,BadgeData被解析,Badge包含状态变量和BadgeData。但我如何将其与状态变量以一种好的方式合并呢?有没有更好的结构呢?

import Foundation

final class ModelData: ObservableObject {
    @Published var badges: [Badge] = // ??

    var badgeData: [BadgeData] = load("badges.json")
    var taken: [Int] = load("taken.json")
}

struct BadgeData: Hashable, Codable, Identifiable {
    let id: Int

    let title: String
    let imageRef: String
    let requirements: [Requirement]
}

struct Badge: Hashable, Codable, Identifiable {
    let data: BadgeData
    var id: Int {
        data.id
    }

    var isTaken: Bool
}

struct Requirement: Hashable, Codable, Identifiable {
    var id: Int

    let title: String
    let detail: String
}
rta7y2nd

rta7y2nd1#

当我将变量添加到标记结构中时,解析失败。
你需要coding keys
通过定义编码键,您可以确定从JSON获得哪些属性以及忽略哪些属性

struct Badge: Hashable, Codable, Identifiable {
    let id: Int

    let title: String
    let imageRef: String
    let requirements: [Requirement]

    var isTaken: Bool

    enum CodingKeys: String, CodingKey 
    {
    case id
    case title
    case imageRef
    case requirements
    }
}

CodingKeys中的案例一对一地Map到您想要从JSON反序列化的属性。
还要注意,CodingKeys有一个原始类型,即String。这意味着您的JSON中可以有不同的属性名称键,例如

enum CodingKeys: String, CodingKey 
    {
    case id
    case title
    case imageRef = "image_ref"
    case requirements
    }

意味着对象中的imageRef属性来自JSON中的image_ref属性。

相关问题