首页 > 解决方案 > 无法使用 Swift 解码 JSON 响应

问题描述

我正在尝试完成一件非常标准的事情:解码 JSON 响应。我可以获得数据,但解码不成功 - 更糟糕的是,没有错误消息。打印语句 1 和 2 输出正确的数据,但我没有从打印语句 3 中得到任何输出,而是输出打印语句 4(例如我的错误消息)。

我希望有人能看到我可能明显的错误,感谢任何可以解决我问题的提示!

菲尔

(编辑)添加 JSON 响应:

[{
    "open": {
        "price": 122.52,
        "time": 1668853732275
    },
    "close": {
        "price": 125.44,
        "time": 1658436480762
    },
    "high": 125.35,
    "low": 123.57,
    "volume": 75244144,
    "symbol": "AAPL"
}]
struct ResponsePrice: Codable {
    var results: [ResultPrice]
}

struct ResultPrice: Codable {
    var open: ResultPriceTime
    var close: ResultPriceTime
    var high: Double
    var low: Double
    var volume: Double
    var symbol: String
}

struct ResultPriceTime: Codable {
    var price: Double
    var time: Double
}
///
struct SymbolView: View {
    @State private var results = [ResultPrice]()

    var body: some View {
        List(resultsPrice, id: \.symbol) { item in
            VStack(alignment: .leading) {
                Text(item.symbol)
                    .font(.headline)
                Text(item.symbol)
            }
        }.onAppear(perform: loadData)
    }
    func loadData() {
        guard let url = URL(string: "https://sandbox.iexapis.com/stable/stock/market/ohlc?symbols=aapl&token=Tpk_af03c7f5bac14742a7ce77969a791c66") else {
            print("Invalid URL")
            return
        }
        let request = URLRequest(url: url)
        
         URLSession.shared.dataTask(with: request) { data, response, error in
            do {
                if let data = data {
                    //let stringData = String(decoding: data, as: UTF8.self)
                    //print(stringData)
                    if let decodedResponse = try JSONDecoder().decode(ResponsePrice.self, from: data) {
                        // we have good data – go back to the main thread
                        print("Fetched: \(url)")
                        DispatchQueue.main.async {
                            // update our UI
                            self.results = decodedResponse.results
                            print("Ticker:\(self.results[0].T)")
                        }
                        
                        // everything is good, so we can exit
                        return
                    }
                }
            }
            catch {
                fatalError("Couldn't parse as :\n\(error)")
            }

            // if we're still here it means there was a problem
            print("4 Decode failed: \(error?.localizedDescription ?? "Unknown error")")
            // step 4
        }.resume()
    }
}

struct SymbolView_Previews: PreviewProvider {
    static var previews: some View {
        SymbolView()
    }
}

标签: iosjsonapi

解决方案


推荐阅读