【发布时间】:2022-01-16 14:11:48
【问题描述】:
这里是初学者。
我在尝试在 SwiftUI 中解析 json url 时遇到了一些麻烦
这是我尝试过的:
import SwiftUI
struct PriceData2: Decodable {
var id: Int
var last: Double
var lowestAsk: Double
var highestBid: Double
var percentChange: Double
var baseVolume: Double
var quoteVolume: Double
var isFrozen: Int
var high24hr: Double
var low24hr: Double
var change: Double
var prevClose: Double
var prevOpen: Double
}
struct ContentView: View {
@State var priceData2: PriceData2?
var body: some View {
if #available(iOS 15.0, *) {
VStack(){
Text("\(priceData2?.id ?? 0)")
}.onAppear (perform: loadData2)
} else {
// Fallback on earlier versions
}
}
public func loadData2() {
guard let url = URL(string: "https://api.bitkub.com/api/market/ticker?sym=THB_BTC") else {
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data else {return}
if let decodedData = try? JSONDecoder().decode(PriceData2.self, from: data){
DispatchQueue.main.async {
self.priceData2 = decodedData
}
}
}.resume()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我认为这与字典的 THB_BTC 属性有关,我没有处理过,但我不完全确定。
非常感谢您提供任何帮助。
谢谢
【问题讨论】:
-
要做的第一件事:不要在
catch中使用try?使用do/try/catch和print(error)。现在,通过使用try?,您将失去任何获得有意义错误的机会。 -
第二步:将你的 JSON 粘贴到 [app.quicktype.io](app.quicktype.io) 中,并将它生成的结构与你拥有的结构进行比较。
-
最后:解析数据不是 SwiftUI 的问题,而是 Swift 的问题。
-
"我认为这与我没有处理过的字典的 THB_BTC 属性有关" 是的,你是对的。继续处理它。 JSON 数据必须解码为
struct PriceData : Decodable { var THE_BTC: PriceData2 } -
当您有想法但不能完全确定时,不要犹豫,尝试一下。尝试没有坏处。