簡體   English   中英

使用 Swift 解碼嵌套 JSON 的多層

[英]Decode multiple layers of a nested JSON with 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 的每個級別,還是有更好的方法?

它沒有我想象的那么復雜。 當我調用project_status?.label時,我得到了一個 nil 值,當我這樣調用它時就解決了這個問題: project_status?.label ?? self.defaultString project_status?.label ?? self.defaultString

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM