【问题标题】:How do I parse this JSON API data in SwiftUI?如何在 SwiftUI 中解析这个 JSON API 数据?
【发布时间】: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/catchprint(error)。现在,通过使用try?,您将失去任何获得有意义错误的机会。
  • 第二步:将你的 JSON 粘贴到 [app.quicktype.io](app.quicktype.io) 中,并将它生成的结构与你拥有的结构进行比较。
  • 最后:解析数据不是 SwiftUI 的问题,而是 Swift 的问题。
  • "我认为这与我没有处理过的字典的 THB_BTC 属性有关" 是的,你是对的。继续处理它。 JSON 数据必须解码为 struct PriceData : Decodable { var THE_BTC: PriceData2 }
  • 当您有想法但不能完全确定时,不要犹豫,尝试一下。尝试没有坏处。

标签: json swift


【解决方案1】:

解码时缺少保存价格数据的顶级类型,有两种方法可以解决这个问题,使用顶级结构或使用字典。

由于顶级键 THB_BTC 似乎是查询中的“符号”参数,因此可能会更改顶级字典是这里的最佳选择

do {
    let result = try JSONDecoder().decode([String: PriceData].self, from: data)
    if let priceData = result.values.first {  //or = result["THB_BTC"]
        print(priceData)
    }
} catch {
    print(error)
}

为了完整起见,这里是顶级结构的变体

struct Result: Decodable {
    enum CodingKeys: String, CodingKey {
        case data = "THB_BTC"
    }
    let data: PriceData
}

let result = try JSONDecoder().decode(Result.self, from: data)
print(result.data)

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多