【问题标题】:Swift JSON decoding error: "Expected to decode Dictionary<String, Any> but found an array instead."Swift JSON 解码错误:“应解码 Dictionary<String, Any> 但找到了一个数组。”
【发布时间】:2020-03-30 20:46:45
【问题描述】:

我在解码以下 JSON(完全包含在一个数组中)时遇到问题:

[
  {
    "symbol": "AAPL",
    "name": "Apple Inc.",
    "price": 254.81,
    "changesPercentage": 2.85,
    "change": 7.07,
    "dayLow": 249.4,
    "dayHigh": 255.5,
    "yearHigh": 327.85,
    "yearLow": 170.27,
    "marketCap": 1114915995648,
    "priceAvg50": 281.9003,
    "priceAvg200": 270.52628,
    "volume": 37900589,
    "avgVolume": 48846970,
    "exhange": "NASDAQ",
    "open": 250.74,
    "previousClose": 247.74,
    "eps": 12.595,
    "pe": 20.231043,
    "earningsAnnouncement": "2020-01-28T21:30:00.000+0000",
    "sharesOutstanding": 4375479808,
    "timestamp": 1585600706
  }
]

这是我用来解码的结构:

struct StockData: Codable {

    let name: String
    let exchange: String
    let price: Double
    let yearLow: Double
    let yearHigh: Double
    let marketCap: Double
}

这是我的解码代码:

func parseJSON(_ stockData: Data) -> StockModel? {
        let decoder = JSONDecoder()
        do{
            let decodedData = try decoder.decode(StockData.self, from: stockData)

                let name = decodedData.name
                let exchange = decodedData.exchange
                let price = String(decodedData.price)
                let yearLow = String(decodedData.yearLow)
                let yearHigh = String(decodedData.yearHigh)
                let marketCap = String(decodedData.marketCap)

            let stockModel = StockModel(name: name, exchange: exchange, stockAttributes: [price, marketCap, yearLow, yearHigh])

            return stockModel

        }catch{
            print(error)
           return nil
        }
    }

我已经尝试过:try decoder.decode([StockData].self, from: stockData)so stockData 括在括号中,表示它是一个数组,但我得到错误

如何解码完全包含在数组中的 JSON?

【问题讨论】:

    标签: json swift parsing codable


    【解决方案1】:

    [StockData].self 是对的。错误(和 JSON)清楚地表明根对象是一个数组。

    要提取数据,获取数组的第一项

    func parseJSON(_ stockData: Data) -> StockModel? {
        let decoder = JSONDecoder()
        do{
            let decodedData = try decoder.decode([StockData].self, from: stockData)
            guard let stock = decodedData.first else { return nil }
            let name = stock.name
            let exchange = stock.exchange
            let price = String(stock.price)
            let yearLow = String(stock.yearLow)
            let yearHigh = String(stock.yearHigh)
            let marketCap = String(stock.marketCap)
    
            let stockModel = StockModel(name: name, exchange: exchange, stockAttributes: [price, marketCap, yearLow, yearHigh])
    
            return stockModel
    
        } catch {
            print(error)
            return nil
        }
    }
    

    请阅读Swift Language Guide

    【讨论】:

    • 瓦迪安,非常感谢您的帮助。我实施了您的更改,现在又遇到了另一个错误。错误的本地化描述是“无法读取数据,因为它丢失了”。而且我没有对代码进行任何额外的更改。如果这是因为其他原因,请告诉我!否则,我可以改变什么来消除我的程序错误?
    • 不打印错误的本地化描述。打印error 实例
    • 它是"没有与键 CodingKeys 关联的值(stringValue: \"exchange\", intValue: nil)"
    • 请检查拼写。在 JSON 中,它是“exhange”,很可能是一个错字。
    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多