使用Swift解码嵌套JSON的多层

时间:2020-03-24 13:53:33

标签: json swift

使用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的每个级别,还是有更好的方法?

1 个答案:

答案 0 :(得分:0)

没有我想的那么复杂。致电project_status?.label时,我得到了零值 当我这样称呼它时,这个问题就解决了: project_status?.label ?? self.defaultString