首页 > 解决方案 > 如何快速访问来自json的深层嵌套数据?

问题描述

我在访问“WaznyDo”时遇到问题:“2021-09-18”Xcode 在尝试遍历数据模型时返回错误

{
    "lastUpdate": "2021-08-31 06:40:35",
    "karty": {
        "0000985766": {
            "bilety": [
                {
                    "Taryfa": [
                        "Miesiczny",
                        " wacny we wszystkie dni tygodnia",
                        " ulgowy",
                        " imienny"
                                ],
                    "Strefa": "Miasto Gdask",
                    "WaznyDo": "2021-09-18"
                }
            ]
        }
    }
}

我尝试了互联网上的每个解码器,但没有帮助

标签: jsonswiftxcode

解决方案


而不是破坏性的评论——这里有一个解决方案:

您需要一些结构来对 JSON 数据的结构进行建模:

struct AllData: Codable {
    let lastUpdate: String
    let karty: Karty
}

struct Karty: Codable {
    let a0000985766: A0000985766
    
    enum CodingKeys: String, CodingKey {
        case a0000985766 = "0000985766"
    }
}

struct A0000985766: Codable {
    let bilety: [Bilety]
}

struct Bilety: Codable {
    let taryfa: [String]
    let strefa, waznyDo: String

    enum CodingKeys: String, CodingKey {
        case taryfa = "Taryfa"
        case strefa = "Strefa"
        case waznyDo = "WaznyDo"
    }
}

如果您将 JSON 数据存储在名为“data.json”的文件中并将其放在应用程序内的某个文件夹中,则可以通过 url 检索它:

let url = Bundle.main.url(forResource: "data", withExtension: "json")

现在这里有一个简单的视图控制器打印出你想要的数据:

import UIKit

class ViewController: UIViewController {

    var allData: AllData!
    // URL of JSON file
    let url = Bundle.main.url(forResource: "data", withExtension: "json")
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        do {
            allData = try JSONDecoder().decode(AllData.self, from: Data(contentsOf: url!))
        } catch {
            print("json error when trying to serialize")
        }
        
        
        // Output results, for example:
        print(allData!.lastUpdate)                          // 2021-08-31 06:40:35
        print(allData!.karty.a0000985766.bilety[0].waznyDo)  // 2021-09-18
    }
}

推荐阅读