Получает ошибку при получении данных из API в Swift: «Ожидается декодирование Dictionary<String, Any>, но вместо этого найден массив»

Я новичок в Swift и в настоящее время пытаюсь получить данные из этого API, но эта ошибка продолжает появляться в журнале:

«Ожидается декодирование Dictionary<String, Any>, но вместо этого найден массив».

Пожалуйста, помогите. См. пример массива с веб-сайта в виде комментария в нижней части фрагмента кода.

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let url = "https://www.fruityvice.com/api/fruit/all"
        getData(from: url)
    }
    
    private func getData(from url: String) {
        let task = URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: { data, response, error in
            
            guard let data = data, error == nil else {
                print("Something went wrong")
                return
            }
            
            var fruits:FruitsData?
            do {
                fruits = try JSONDecoder().decode(FruitsData.self, from: data)
            }
            catch {
                print(String(describing: error))
            }
            
            guard let json = fruits else {
                return
            }
            
            print(json.fruits)
            
        })
        
        task.resume()
    }


}

struct FruitsData: Codable {
    let fruits: [Fruit]
}

struct Fruit: Codable {
    let genus: String
    let name: String
    let id: Int
    let family: String
    let order: String
    let nutritions: NutritionList
}

struct NutritionList: Codable {
    let carbohydrates: Double
    let protein: Double
    let fat: Double
    let calories: Int
    let sugar: Double
}
 [
    {
     "genus": "Malus",
     "name": "Apple",
     "id": 6,
     "family": "Rosaceae",
     "order": "Rosales",
     "nutritions": {
         "carbohydrates": 11.4,
         "protein": 0.3,
         "fat": 0.4,
         "calories": 52,
         "sugar": 10.3
        }
    }, {
     "genus": "Prunus",
     "name": "Apricot",
     "id": 35,
     "family": "Rosaceae",
     "order": "Rosales",
     "nutritions": {
         "carbohydrates": 3.9,
         "protein": 0.5,
         "fat": 0.1,
         "calories": 15,
         "sugar": 3.2
        }
    }
 ]

Я попытался запустить код, ожидая, что массив будет напечатан из API, вместо этого я получил эту ошибку: «Ожидается декодирование словаря <String, Any>, но вместо этого найден массив».

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Данные JSON содержат список фруктов (массив), но вы пытаетесь расшифровать FruitsData. Ожидается, что верхний уровень JSON будет выглядеть так:

{
    "fruits": [ … ]
}

Вместо этого вам нужно декодировать массив фруктов напрямую следующим образом:

var fruits:[Fruit]?
do {
    fruits = try JSONDecoder().decode([Fruit].self, from: data)
}
catch {
    print(String(describing: error))
}

Я сделал то, что вы предложили, но в строке, которая говорит - print(json.fruits) - я получаю сообщение об ошибке: «Значение типа [Fruit]» не имеет члена «fruits»».

davidmark 24.11.2022 12:16

@davidmark удалите свое заявление о печати.

udi 24.11.2022 12:28

но я хочу вывести данные о фруктах на консоль, как это сделать?

davidmark 24.11.2022 12:37

затем используйте печать (json)

udi 24.11.2022 12:38

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