Тип JSONDecoder не подходит.Код 3840 - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь позвонить в API Zomato (Категории).Я получаю сообщение об ошибке в отношении dataCorrupted и кода 3840.

Я почти уверен, что у меня неверный тип в JSONDecoder (). Decode (type :, from :) или моя структура Category не установлена

Мой вызов API:

let baseURL = URL(string: "https://developers.zomato.com/api/v2.1/")
let categoryURL = baseURL?.appendingPathComponent("categories")
var request = URLRequest(url: categoryURL!)
request.addValue("myAPIKey", forHTTPHeaderField: "user-key")
request.addValue("application/json", forHTTPHeaderField: "Accept")

URLSession.shared.dataTask(with: baseURL!) { (data, response, err) in
   guard let data = data else {return}

   do {
     let courses =  try JSONDecoder().decode([Categories].self, from: data)
     print(courses)
   } catch let jsonErr {
        print(jsonErr)
   }
}.resume()

Моя структура:

struct Categories: Codable{
    var id: Int?
    var name: String?   
}
{
    "categories": [
        {
            "categories": {
                "id": 1,
                "name": "Delivery"
            }
        },
        {
            "categories": {
                "id": 2,
                "name": "Dine-out"
            }
        }
   ]
}

Ответы [ 3 ]

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

Вам необходимо объявить свои типы данных, как показано ниже,

struct Response: Codable {
    let categories: [Category]
}

struct Category: Codable {
    let categories: Categories
}

struct Categories: Codable {
    let id: Int
    let name: String
}

URLSession.shared.dataTask(with: baseURL!) { (data, response, err) in
   guard let data = data else {return}

   do {
     let courses =  try JSONDecoder().decode(Response.self, from: data)
     print(courses)
   } catch let jsonErr {
        print(jsonErr)
   }
}.resume()

Вы всегда можете указать здесь JSON в app.quicktype.io , чтобы получить правильные типы данных.

0 голосов
/ 25 апреля 2019

Как указал @vadian, проблема связана с вашим API.

Вот что должен ответить ваш API, чтобы ваш код работал:

[
    {
            "id": 1,
            "name": "Delivery"
    },
    {
            "id": 2,
            "name": "Dine-out"
    }
]
0 голосов
/ 25 апреля 2019
let courses = try JSONDecoder().decode([String: [[String: Categories]]].self, from: data)

print(courses["categories"]![0]["categories"]?.name)  // prints Optional("Delivery") base on your json    

let categoriesAsArray = (courses["categories"].map { $0 })?.map { $0["categories"] }
...