有没有办法只从 Swift 中的 JSON 创建一个对象?

Is there a way to only partially create an object from JSON in Swift?

我正在创建一个 SwiftUI 抽认卡应用程序,使用 Codable 并遵循 Apple 用他们的 landmarks tutorial app 演示的技术导入 JSON 数据以创建他们的对象数组我没有问题.

但是,我的抽认卡对象的两个属性不需要从 JSON 加载,如果我可以分别初始化这些值,我可以最小化 JSON 文件中所需的文本而不是从 JSON 加载它们。问题是我无法在没有错误的情况下加载 JSON 数据,除非它精确映射到对象的所有属性,即使缺少的属性是用值硬编码的。

这是我的对象模型:

import SwiftUI

class Flashcard: Codable, Identifiable {
    let id: Int
    var status: Int
    let chapter: Int
    let question: String
    let answer: String
    let reference: String
}

这是有效的JSON:

[
  {
    "id": 1,
    "status": 0,
    "chapter": 1,
    "question": "This is the question",
    "answer": "This is the answer",
    "reference": "This is the reference"
  }
  //other card info repeated after with a comma separating each
]

与其在 JSON 中不必要地列出 "id" 和 "status",我更愿意将模型更改为如下所示:

import SwiftUI

class Flashcard: Codable, Identifiable {
    let id = UUID()
    var status: Int = 0

    //only load these from JSON:
    let chapter: Int
    let question: String
    let answer: String
    let reference: String
}

...然后我理论上应该能够从 JSON 中消除 "id" 和 "status"(但我不能)。有没有一种简单的方法可以防止 JSON 未完全映射到对象的错误?

是的,您可以通过在 Codable class 上设置编码键来实现。只需从 json.

中删除您不想更新的那些
class Flashcard: Codable, Identifiable {
    let id = UUID()
    var status: Int = 0
    let chapter: Int
    let question: String
    let answer: String
    let reference: String

    enum CodingKeys: String, CodingKey {
        case chapter, question, answer, reference
    }
}

HackingWithSwift 在 Codable 上有一篇很棒的文章 here

您可以使用 CodingKeys 来定义要从 JSON 中提取的字段。

class Flashcard: Codable, Identifiable {
    enum CodingKeys: CodingKey {
       case chapter
       case question
       case answer
       case reference
    }

    let id = UUID()
    var status: Int = 0

    //only load these from JSON:
    let chapter: Int
    let question: String
    let answer: String
    let reference: String
}

The docuemntation has a good explanation (for once) of this under `Encoding and Decoding Custom Types`