json - 如何从 JSON 对象 Swift 4 中检索值

标签 json swift fetch decode codable

我正在尝试使用 Codable 和 Swift 4 解码 JSON 对象:

{
USD: {
"15m": 9977.49,
last: 9977.49,
buy: 9979.36,
sell: 9975.62,
symbol: "$"
    },
AUD: {
"15m": 13181.69,
last: 13181.69,
buy: 13184.16,
sell: 13179.22,
symbol: "$"
    },
TBD: {
"15m": 13181.69,
last: 13181.69,
buy: 13184.16,
sell: 13179.22,
symbol: "$"
    }
}

这是到目前为止我对对象模型所做的:

struct Currency: Codable {

    let fifteenMin: Double?
    let last: Double?
    let buy: Double
    let sell: Double
    let symbol: String

    enum CodingKeys: String, CodingKey {
        case fifteenMin = "15m"
        case last
        case buy
        case sell
        case symbol
    }
}

这就是我解码的方式:

var currencyName = [String]()
var currenciesArray = [Currency]()


func fetchCurrencyData() {
    guard let urlString = API.RateURL.absoluteString else { return }
    guard let url = URL(string: urlString) else { return }
    let jsonData = try! Data(contentsOf: url)
    let decoder = JSONDecoder()
    do {
        let currenciesData = try decoder.decode([String: Currency].self, from: jsonData)
        for currency in currenciesData {
            self.currencyName.append(currency.key)
            self.currenciesArray.append(currency.value)
        }
    } catch let err {
        print(err.localizedDescription)
    }
}

因此,当我想用​​该数据填充 tableView 中的行时,我使用“for 循环”并在一个数组中附加“USD”、“AUD”等,在另一个数组中附加 Currency 对象。

获取数据和填充 Currency 对象的更好方法是什么。因为我很确定获取相同的 JSON 对象并将其附加到两个单独的数组中并不是我认为的好做法。

如果我的问题不清楚,我可以更详细地解释我想要实现的目标。

谢谢。

最佳答案

维护多个数组非常烦人(而且容易出错)。我建议在结构中包含名称

Currency 中添加这一行

var name = ""

解码JSON后对keys进行排序,得到对应的值并将name设置为key

var currenciesArray = [Currency]()

let currencies = try decoder.decode([String: Currency].self, from: jsonData)

for key in currencies.keys.sorted() {
    var currency = currencies[key]!
    currency.name = key
    currenciesArray.append(currency)
}
print(currenciesArray)

关于json - 如何从 JSON 对象 Swift 4 中检索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47627343/

相关文章:

json - 从 Node.js 中的 TCP 套接字读取字符串时出现问题

arrays - 如何正确调用 CFBinaryHeapGetValues() 并在 Swift 中解析生成的 C 数组?

ios - 总是调用 ViewDidLoad

php - php中的fetch有什么作用?

php - mysql取数组报错2

ios - 使用 AWS DynamoDBScanExpression 查找列表中具有键的所有对象

xml - 谷歌 Protocol Buffer vs json vs XML

sql - JSON 在较低级别上没有数组包装器

swift - Swift 项目中的 C++ dylib - dylib 中公开的函数的 undefined symbol

javascript - For 循环无法正确访问 JSON 对象?