arrays - JSON 与数组中的字典

标签 arrays json swift dictionary

自上周以来我一直收到错误,但我可以找到问题所在。也许你可以帮我。

我有这个功能:

    func getAllBlocks () { //Abruf der JSON Daten zum Überblick.
    let JSONurl = "https://chain.api.btc.com/v3/block/latest,5000,2" //URL festlegen
    let url = URL(string: JSONurl ) //String umwandeln in eine URl
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in //Datenabruf
        if error != nil {
            print("ERROR \(String(describing: error))")
            return
        }
        do {
            let loadedJSON = try JSONSerialization.jsonObject(with: data!) as! [String:Any] //JSON verarbeiten
            print(loadedJSON)
            for (key, value) in loadedJSON {
                print(key)
                if (key == "data") { //prüfen auf key "data" und dann dessen Dict abgreifen
                    print("data")
                    XXXX

                        }}

        } catch{ print("Error beim JSON decodieren! \(error)") }
    }
    task.resume()
}

所以它应该做的是:从 URL 中获取这三个 block ,并将所有数据放入数组或结构中。它的作用:只要我只加载“最新” block 就可以了。但是当我加载多个 block 时,会弹出一个我无法处理的数组。 代码运行到最后一个打印语句,但之后无论我如何尝试获取数据,它都会崩溃。

我做错了什么?

谢谢!

最佳答案

您可以使用 Swift Codable Protocol(可从 Swift 4 获得)解析 JSON。为此,您需要创建一个必须符合可编码协议(protocol)的结构。在本例中,我创建了两个结构。 “BitCoinData”保存数据收集和错误。 “BitData”是保存数据集合内部的属性。

请注意,属性应与 JSON 响应键相同

使用以下网址中的数据进行测试:

https://chain.api.btc.com/v3/block/5000,50001

https://chain.api.btc.com/v3/block/latest,5000,2

struct BitCoinData: Codable {
    var data : [BitData]?
    var err_no: Int?
    var err_msg: String?
}

struct BitData: Codable {
    var height: Int?
    var version: Int?
    var mrkl_root: String?
    var timestamp: Int?
    var bits : Int?
    var nonce: Int?
    var hash: String?
    var prev_block_hash: String?
    var next_block_hash: String?
    var size: Int?
    var pool_difficulty: Int?
    var difficulty: Double?
    var tx_count: Int?
    var reward_block: Int?
    var reward_fees: Int?
    var created_at: Int?
    var confirmations: Int?
    var is_orphan: Bool?
    var curr_max_timestamp: Int?
    var is_sw_block: Bool?
    var stripped_size: Int?
    var weight: Int?
}

//JSONDecoder 解析响应。

    do {
         let decoder = JSONDecoder()
//Pass the class here to start decoding your JSON response with respect to your mapped class.
          let gitData = try decoder.decode(BitCoinData.self, from: responseData)
          print("JSON Response: \(gitData.data![0].height!)")

        }
        catch DecodingError.dataCorrupted{
            print("Data Corrupted");
        }
        catch DecodingError.typeMismatch{
            print("typeMismatch");
        }
        catch DecodingError.valueNotFound{
            print("Value Not Found");
        }
        catch DecodingError.keyNotFound{
            print("Key Not Found");
        }
        catch {
            print("Unable to Parse");
        }

关于arrays - JSON 与数组中的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48404467/

相关文章:

javascript - 使用搜索关键字对数组进行排序 - Javascript

json - 如何使用jsp创建Jqgrid

java - 在一个 Json 皮肤中使用多种字体

swift - 通过 NSWindowController 从窗口中删除 RepresentedFilename

ios - 通用应用程序开发过程中如何为iPhone和iPad设置相同的图像?

ios - Swift 4.1 JWT http header 承载在服务器中返回401

arrays - 如何在 bash 中逐行将命令输出转换为数组?

php - 如何在数组中创建一个新字段?

javascript - 循环遍历 Google App 脚本并设置多个不连续的值

java - 写入和访问保存到内存的 JSON 文件