Swift JSON ошибка декодирования: «Ожидается декодирование словаря но нашел вместо этого массив. " - PullRequest
0 голосов
/ 30 марта 2020

Я быстрый новичок, и у меня возникают проблемы с декодированием следующего 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), чтобы stockData заключили в скобки, указывая, что это массив, но я получаю ошибки

Как мне декодировать JSON, который полностью заключен в массив ?? Я знаю, что люди с продвинутыми навыками быстрого реагирования смогут легко ответить на этот вопрос, я исчерпал все варианты и понятия не имею, каково решение. Пожалуйста, пожалуйста, пожалуйста, помогите! Если у вас есть дополнительные вопросы, я отвечу в течение дня.

1 Ответ

3 голосов
/ 30 марта 2020

[StockData].self верно. Ошибка (и JSON) ясно указывает на то, что объект root является массивом.

Для извлечения данных получите первый элемент массива

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

...