Я новичок в 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>, но вместо этого найден массив».
Данные JSON содержат список фруктов (массив), но вы пытаетесь расшифровать FruitsData
. Ожидается, что верхний уровень JSON будет выглядеть так:
{
"fruits": [ … ]
}
Вместо этого вам нужно декодировать массив фруктов напрямую следующим образом:
var fruits:[Fruit]?
do {
fruits = try JSONDecoder().decode([Fruit].self, from: data)
}
catch {
print(String(describing: error))
}
@davidmark удалите свое заявление о печати.
но я хочу вывести данные о фруктах на консоль, как это сделать?
затем используйте печать (json)
Я сделал то, что вы предложили, но в строке, которая говорит - print(json.fruits) - я получаю сообщение об ошибке: «Значение типа [Fruit]» не имеет члена «fruits»».