При декодировании JSON с помощью Swift 5.2 выдается ошибка «Ожидается декодирование массива <Any>, но вместо этого найден словарь». - PullRequest
0 голосов
/ 25 апреля 2020

в течение нескольких часов я не могу понять, что не так с моим кодом. Я много раз проверял свой код и inte rnet, но не нашел ничего действительно полезного. Моя проблема в том, что я использую API finnhub.io, чтобы получить JSON, который я затем хочу правильно декодировать. Все работает нормально, кроме декодирования, которое приводит к ошибке. Пожалуйста, посмотрите код ниже, может быть, вы можете дать мне подсказку, у меня действительно нет идей.

JSON Я получаю:

[{u'date': u'2019-11-07', u'symbol': u'AAPL', u'amount': 0.77}, {u'date': u'2019-08-09', u'symbol': u'AAPL', u'amount': 0.77}, {u'date': u'2019-05-10', u'symbol': u'AAPL', u'amount': 0.77}, {u'date': u'2019-02-08', u'symbol': u'AAPL', u'amount': 0.73}]

Мой SWIFT-код выглядит так:

import SwiftUI

struct Dividends: Decodable {
    let dividend: Dividend
}

struct Dividend: Decodable {
    let date: String
    let symbol: String
    let amount: String
}

let json = """
{
    "date": "2000-01-01",
    "symbol": "AAPL",
    "amount": "0.0"
}
""".data(using: .utf8)!

struct ContentView: View {

    var body: some View {
        Text("Text")
        .onAppear(perform: loadData)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

func loadData() {
    let jsonData = json

    let url = URL(string: "https://finnhub.io/api/v1/stock/dividend?symbol=AAPL&from=2010-01-01&to=2020-12-31&token=xxx")!
    let urlSession = URLSession.shared
    let task = urlSession.dataTask(with: url) { data, response, error in

        let dividends: [Dividend] = try! JSONDecoder().decode([Dividend].self, from: jsonData)

        for dividend in dividends {
            print(dividend.symbol)
            print(dividend.date)
            print(dividend.amount)
        }
    }

    // data task needs to be started explicitly via resume
    task.resume()
}

И сообщение об ошибке, которое я получаю при запуске приложения:

Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: nil)): file /Users/joe/Desktop/LoadJSON/LoadJSON/ContentView.swift, line 50
2020-04-25 14:02:33.682895+0200 LoadJSON[2347:102791] Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: nil)): file /Users/joe/Desktop/LoadJSON/LoadJSON/ContentView.swift, line 50

Насколько я понимаю, мой JSON - это массив словарных элементов, но я не могу ' не удается правильно его декодировать. Мой код действительно так испорчен?

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Либо вы должны исправить свой тест json, как показано ниже,

let json = """
[
{
    "date": "2000-01-01",
    "symbol": "AAPL",
    "amount": "0.0"
},
{
    "date": "2000-01-01",
    "symbol": "AAPL",
    "amount": "0.0"
}
]
""".data(using: .utf8)!

ИЛИ использовать фактическое data, возвращенное из API как,

let dividends: [Dividend] = try! JSONDecoder().decode([Dividend].self, from: data!)
0 голосов
/ 25 апреля 2020

Ваш JSON должен выглядеть так:

let json = """
"Something" : [
{
    "date": "2000-01-01",
    "symbol": "AAPL",
    "amount": "0.0"
},
{
    "date": "2000-01-01",
    "symbol": "AAPL",
    "amount": "0.0"
}
]

""".data(using: .utf8)!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...