在 SwiftUI 中将 JSON 数据作为对象加载

Posted

技术标签:

【中文标题】在 SwiftUI 中将 JSON 数据作为对象加载【英文标题】:Loading JSON data as object in SwiftUI 【发布时间】:2021-01-21 08:20:06 【问题描述】:

在 swiftui 上遵循苹果开发者教程,https://developer.apple.com/tutorials/swiftui/

我想稍微修改一下,以便在对象 Landmark 中包含更多字段:

例如:

struct Landmark: Hashable, Codable, Identifiable 
    var id: Int
    var name: String
    var park: String
    var state: String
    var description: String
    var isFavorite: Bool
    var isFeatured: Bool
    var comment: String // example, added this field

然而,对于这个字段,我想用它来让用户输入评论。该字符串在 .json 文件中不可用,因此无法在“加载”-ing json 数据的阶段填写此信息。

我发现当这个字段在 JSON 文件中不可用时,这会导致错误和应用程序崩溃。我该如何解决这个问题?对象中的所有字段都必须出现在 JSON 文件中吗?

【问题讨论】:

【参考方案1】:

由于comment 字段可能不存在,您应该将其设为可选类型:

struct Landmark: Hashable, Codable, Identifiable 
    var id: Int
    var name: String
    var park: String
    var state: String
    var description: String
    var isFavorite: Bool
    var isFeatured: Bool
    var comment: String? // example, added this field

【讨论】:

即使我已将其设为可选,但如果该字段不在 JSON 中,应用程序将崩溃。 您能否在控制台日志中分享崩溃的详细信息?【参考方案2】:

如果您的结构中只有一些属性包含在 json 中,那么通过添加仅包含 json 属性的 CodingKey 枚举并让其他属性可选或为它们提供一个默认值。

由于我不知道原始 json,我在下面的示例中假设最后 3 个属性包含在 json 中

struct Landmark: Hashable, Codable, Identifiable 
    var id: Int
    var name: String
    var park: String
    var state: String
    var description: String
    var isFavorite: Bool = false //use default value
    var isFeatured: Bool = false //use default value
    var comment: String? //make optional

    enum CodingKeys: String, CodingKey 
        case id
        case name
        case park
        case state
        case description
    

【讨论】:

以上是关于在 SwiftUI 中将 JSON 数据作为对象加载的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中将部分文本加粗

如何在 SwiftUI 中将模糊效果作为背景?

如何在文本字段中将对象作为输入传递。并得到它的对象

如何在Nodejs中将字符串作为读取流对象传递?

如何在 MySQL/MariaDB 中将 LONGTEXT 字段作为 JSON 返回

如何在php rabbitmq中将完整对象作为消息从生产者发送到消费者