我正在尝试使用 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/