编写 SwiftUI 模型以从带有数组的 JSON 文件中读取

Posted

技术标签:

【中文标题】编写 SwiftUI 模型以从带有数组的 JSON 文件中读取【英文标题】:Writing a SwiftUI model to read from a JSON file with Arrays 【发布时间】:2019-10-28 18:27:11 【问题描述】:

在处理数据流方面,我非常熟悉,但我试图强迫自己通过构建应用程序来学习它。我正在努力研究如何编写模型以正确引用 JSON 文件中的嵌套键。

JSON 看起来像这样:

[
    "id": 1001,
    "first_name": "Jimmy",
    "last_name": "Simms",
    "cities": [
            "name": "New York City",
            "towns": [
                    "name": "***lyn"
                ,
                
                    "name": "Manhatten"
                
            ]
        ,
        
            "name": "Tokyo",
            "towns": [
                    "name": "Churo"
                ,
                
                    "name": "Riponggi"
                
            ]
        
    ]
]

我不确定该怎么做是编写一个模型,让我可以定位数组中的嵌套元素。从广义上讲,我想知道您如何为这个 JSON 集纠正一个 SwiftUI 模型。

这是我在黑暗中的一种尝试:

import SwiftUI

struct MyDataModel: Identifiable 
    var id: Int
    var first_name: String
    var last_name: String
    var cities: Array<Any>
    var cities.name: String
    var cities.towns: Array<Any>
    var cities.towns.name: String

但是我访问嵌套数组“Cities”和第二级“Towns”的语法只是组成,我可以找到如何访问这样的嵌套键的参考?任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

基本上你想为嵌套组件创建结构。 MyDataModel 有一个城市数组,因此需要一个 City 对象数组。同样,每个City 都有一个城镇数组,因此需要一个Town 对象数组。

假设您正在从 api 访问 JSON 并希望将其转换为对象,您需要使其符合 Codable,这相当简单。按照惯例,Swift 不使用蛇形大小写作为变量名,而是使用驼峰式大小写,因此您可以使用枚举作为编码键,也可以在解码器中传递一个选项。

struct MyDataModel: Codable, Identifiable 
    let id: Int
    let firstName: String
    let lastName: String
    let cities: [City]

    enum CodingKeys: String, CodingKey 
        case id
        case firstName = "first_name"
        case lastName = "last_name"
        case cities
    


struct City: Codable 
    let name: String
    let towns: [Town]


struct Town: Codable 
    let name: String

更新

你可以用它做这样的事情,其中​​myDataModels 是你的MyDataModel 的数组:

var body: some View 
    List 
        ForEach(myDataModels)  model in
            Section(header: Text("\(model.firstName) \(model.lastName)")) 
                ForEach(model.cities, id: \.name)  (city: City) in
                    Section(header: Text(city.name).fontWeight(.bold)) 
                        ForEach(city.towns, id: \.name)  town in
                            Text(town.name)
                        
                    
                
            
        
    

看起来像这样:

【讨论】:

太棒了。谢谢安德鲁——非常有帮助!您能否分享一个示例,说明如何在视图中引用城镇名称? @FuegoDeBassi 我添加了一个小代码示例,展示了如何从数据构建视图。 哇,这正是我想要达到的目标。我在 body 调用上方添加了 var myDataModels: [MyDataModel] ,但我不清楚如何在我的 PreviewProvider 中引用它然后引用 myDataModels? 我很高兴它有所帮助。听起来您确实需要进一步的帮助。我建议将相关部分写成一个新问题(甚至可能是几个问题),以便您可以清楚地表达您需要做的所有事情,因为 SO 上的 cmets 并不允许进行详细的讨论。一方面,这里的代码格式不好;其次,你被限制在 600 个字符以内,所以很难充分表达自己。 点很好。准确地写出我想要表达的内容本身就是一个有用的练习。 ***.com/questions/58597549/…

以上是关于编写 SwiftUI 模型以从带有数组的 JSON 文件中读取的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:列表中的数据有时出现有时不出现

获取 JSON 数据以从数组中填充 TableView

SwiftUI:CoreData 和复杂的 JSON

如何将带有嵌套数组的 JSON 对象映射到打字稿模型中?

将 numpy 数组列表转换为 json 以从烧瓶 api 返回

将 JSON 响应分配给模型 SwiftUI