【问题标题】:Decode multiple layers of a nested JSON with Swift使用 Swift 解码多层嵌套 JSON
【发布时间】:2020-03-24 13:53:33
【问题描述】:

我在使用 SwiftUI 解码 json 数据时遇到问题,我有以下 json。

{
    "data": [
        {
            "id": "project:xxxxxx",
            "project_manager": {
                "employee_id": "employee:xxxxxx",
                "id": "employee:xxxxxx",
                "person_id": "person: xxxxxx",
                "name": "Peter Post"
            },
            "project_status": {
                "id": "projectstatus:xxxxxx",
                "label": "active"
            },
            "created": "2019-01-08 15:39:59",
            "modified": "2019-01-24 14:39:13",
            "created_at": "2019-01-08 15:39:59",
            "updated_at": "2019-01-24 14:39:13",
            "url": "https://url.com/projects/project/view?id=000",
...

我正在使用以下代码解码 json

import Foundation

struct Projects: Decodable {
    let data: [Data]
}

struct Data : Decodable, Identifiable {
    let id: String
    let url: String
    let organization: Organization?
    let project_status: ProjectStatus?
}

struct Organization : Decodable, Identifiable {
    let id: String?
    let name: String?
}

struct ProjectStatus: Decodable, Identifiable {
    let id: String?
    let label: String?
}
import Foundation
import SwiftUI
import Combine

class NetworkingManager: ObservableObject {
    @Published var projectList = Projects(data: [])


    init() {  
        var request = URLRequest(url: URL(string: "https://api-url/projects")!,timeoutInterval: Double.infinity)
        request.addValue("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", forHTTPHeaderField: "Authentication-Key")
        request.addValue("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", forHTTPHeaderField: "Authentication-Secret")

        URLSession.shared.dataTask(with: request) { (data, _, _) in
            guard let data = data else { return }

            let projectList = try! JSONDecoder().decode(Projects.self, from: data)

            DispatchQueue.main.async {
                self.projectList = projectList
                print(self.projectList)
            }
        }.resume()
    }
}
import SwiftUI

struct ContentView : View {
    @ObservedObject var networkingManager = NetworkingManager()

    var body: some View {
        VStack {
            List(networkingManager.projectList.data, id: \.id) { project in
                HStack {
                    Text(project.id)
                    Text(project.url)

                }

            }
        }
    }
}

struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

这会产生一个 id 和 url 字符串值列表,但我的问题是:如何列出多个级别的 json 文件。我是否必须解码我想使用的每个级别的 json,还是有更好的方法?

【问题讨论】:

    标签: json swift


    【解决方案1】:

    它没有我想象的那么复杂。当我打电话给project_status?.label 时,我得到了一个 nil 值 当我这样称呼它时,这已解决: project_status?.label ?? self.defaultString

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 2018-07-02
      相关资源
      最近更新 更多