Невозможно разобрать JSON с помощью Codeable

Я пытаюсь понять функцию Apple Codeable для анализа JSON. Я следую учебнику на YouTube, это код:

override func viewDidLoad() {
    super.viewDidLoad()

    struct Forex: Decodable {
        let open: Int?
        let close: Int?
        let high: Int?
    }

    let jsonUrlString = "https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol=EUR&to_symbol=USD&interval=5min&apikey=demo"

    let urlObj = URL(string: jsonUrlString)

    URLSession.shared.dataTask(with: urlObj!) {(data, response, error)} in

    do {
        let forex = try JSONDecoder().decode([Forex].self, from: data)

    } catch {


    }

Когда я пытаюсь построить, я сталкиваюсь с 6 различными ошибками: Изображение ошибки

Когда я применяю предложенное исправление из XCode, оно не решает проблему, а видео человек может собрать без одной из этих ошибок.

Может ли кто-нибудь посоветовать, где я ошибся, или Apple изменила способ разбора json с помощью codeable?

Удалите } между error) и in.

rmaddy 21.05.2019 20:13

В JSON вообще нет массива. Связано : stackoverflow.com/questions/51863329/…

vadian 21.05.2019 20:17
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
2
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш корень - это словарь с 2 ключами по вашей попытке вам нужен ключ timeSeriesFX5Min

class VCName:UIViewController {
   override func viewDidLoad() {
     super.viewDidLoad() 

    let jsonUrlString = "https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol=EUR&to_symbol=USD&interval=5min&apikey=demo"

    let urlObj = URL(string: jsonUrlString)

    URLSession.shared.dataTask(with: urlObj!) {(data, response, error) in
     guard let data = data else { return }  
    do {
        let forex = try JSONDecoder().decode(Root.self, from: data)
        print(forex.timeSeriesFX5Min)
    } catch {

        print(error)
    }

    }.resume()
  }
}       


struct Root: Codable { 
    let timeSeriesFX5Min: [String:Forex]

    enum CodingKeys: String, CodingKey { 
        case timeSeriesFX5Min = "Time Series FX (5min)"
    }
}


// MARK: - TimeSeriesFX5Min
struct Forex: Codable {
    let the1Open, the2High, the3Low, the4Close: String

    enum CodingKeys: String, CodingKey {
        case the1Open = "1. open"
        case the2High = "2. high"
        case the3Low = "3. low"
        case the4Close = "4. close"
    }
}

Позвольте мне посмотреть, правильно ли я понял: вы сопоставили временной ряд с timeSeriesFX5Min, поскольку в коде не было ключевого слова, соответствующего этому, а затем сделали то же самое для открытия, максимума, минимума, закрытия. Я также понял, что вы удалили фигурную скобку } в 'ошибке) в', которая вызывала ошибки. А ключевое слово Root — это просто имя структуры или у него другая цель?

Leone Mitchell 21.05.2019 21:09

Другие вопросы по теме