簡體   English   中英

如何解析具有字典鍵:值對的 json 數據? 我正在嘗試提取符號和值對

[英]How parse a json data that has a dictionary key:value pair? I'm trying to extract the symbol and value pair

如何正確解析以下json數據? 我的問題是: if let rates = data["rates"] as? NSDictionary... if let rates = data["rates"] as? NSDictionary...

json數據

{   "valid": true,   
    "timestamp": 1579683079,   
    "base": "USD",  
    "rates": {
       "AED": 3.67316,
       "AFN": 77.99911,
       "ALL": 110.11741,
       ...
       "ZAR": 14.45,
       "ZMW": 14.63257   
     } 
 }

代碼

import UIKit

struct CurrencyRate {
    var valid: String
    var timestamp: Int
    var base: String
    var rates: [String:Double] = [:]
}

class ViewController: UIViewController {

var mySymbols:[String] = []
var myValues:[Double] = []


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    let jsonUrlString = "https://currencyapi.net/api/v1/rates?key=6b171cc58787d922eb53e3684d97784d165a&base=USD"

    guard let url = URL(string: jsonUrlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, err) in
        guard let data = data else { return }

        //let dataAsString = String(data: data, encoding: .utf8)
        if let rates = data["rates"] as? NSDictionary {
            for (key, value) in rates {
                self.mySymbols.append((key as? String)!)

                self.myValues.append((value as? Double)!)
            }
        }


    }.resume()

}

}

語法

for (key, value) in ...

枚舉字典僅適用於本機 Swift 字典。

這應該可以工作,如果您轉換為特定的[String:Double]您甚至可以擺脫keyvalue的丑陋類型轉換。

if let rates = data["rates"] as? [String:Double] {
    for (key, value) in rates {
        self.mySymbols.append(key)
        self.myValues.append(value)
    }
}

但是,我們鼓勵您使用可Decodable協議來解析 JSON。 只有一些細微的變化。

struct CurrencyRate : Decodable {
    let valid: Bool // must be Bool
    let timestamp: Date 
    let base: String
    let rates: [String:Double]
}

var rates = [String:Double]()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    let jsonUrlString = "https://currencyapi.net/api/v1/rates?key=6b171cc58787d922eb53e3684d97784d165a&base=USD"

    guard let url = URL(string: jsonUrlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, _, error) in
        guard let error = error else { print(error); return }

        do {
           let decoder = JSONDecoder()
           decoder.dateDecodingStrategy = .secondsSince1970
           let result = try decoder.decode(CurrencyRate.self, from: data!)
           self.rates = result.rates
           print(rates)
        } catch {
            print(error)
        }
    }.resume()   
}

timestamp被解碼為Date

不要使用NSDictionary - 在 Swift 中使用Dictionary類型。 此外,你有data ,它根本不是字典。 它是Data類型。 使用應該將您的數據轉換為您的類型。 嘗試使用此代碼:

URLSession.shared.dataTask(with: url) { (data, response, err) in
    guard let data = data else { return }

    let jsonResult = try? JSONSerialization.jsonObject(with: data)

    if let dict = jsonResult as? Dictionary<String, Any>, let rates = dict["rates"] as? Dictionary<String, Double> {
        for (key, value) in rates {
            print(key, value)
            self.mySymbols.append(key)
            self.myValues.append(value)
        }
    }
}.resume()

Codable有一種方法,但我想這將是您的下一個挑戰。 另外請記住,代碼是異步執行的,全局變量中的數據不會立即出現

暫無
暫無

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

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