Ошибка Alamofire для декодирования ответа JSON с помощью Struct - PullRequest
0 голосов
/ 21 июня 2019

У меня проблема с моим alamofire.request. Ответ ноль, но я не понимаю, почему.

Моя проблема: я использую API OpenFoodFacts, он работает с веб-адресом этого стиля: https://fr.openfoodfacts.org/api/v0/produit/3366321054229

Я использую Alamofire для получения запроса с протоколом, сессией и службой.

Мой протокол:

protocol CheckerFridgeProtocol {
    func request(url: URL, parameters: Parameters, callback: @escaping (DataResponse<Any>) -> Void )
}

Моя сессия:

class CheckerFridgeSession: CheckerFridgeProtocol {

    func request(url: URL, parameters: Parameters, callback: @escaping (DataResponse<Any>) -> Void) {
        Alamofire.request(url, method: .get, parameters: parameters).responseJSON { responseData in
            callback(responseData)
        }
    }
}

Мой сервис:

class CheckerFridgeService {

    private var checkerFridgeSession: CheckerFridgeSession

    init(checkerFridgeSession: CheckerFridgeSession = CheckerFridgeSession()) {
        self.checkerFridgeSession = checkerFridgeSession
    }

    // get recipe ingredients
    func getRequest(barCode: String, callback: @escaping (Bool, CheckerFridgeData?) -> Void) {
        let parameters: Parameters = [:]

        let url = URL(string: "https://fr.openfoodfacts.org/api/v0/produit/\(barCode)")!

        checkerFridgeSession.request(url: url, parameters: parameters) { (response) in

            DispatchQueue.main.async {
                guard response.response?.statusCode == 200 else {
                    print("Response 400 Error")
                    callback(false, nil)
                    return
                }

                guard let data = response.data else {
                    print("Data error")
                    callback(false, nil)
                    return
                }

                guard let responseJSON = try? JSONDecoder().decode(CheckerFridgeData.self, from: data) else {
                    print("Response JSON Failed")
                    callback(false, nil)
                    return
                }

                guard responseJSON.status > 0 else {
                    print("Status Code 0")
                    callback(false, nil)
                    return
                }

                // print(response.result.value as Any)

                callback(true, responseJSON)
            }
        }
    }
}

У меня есть файл CheckerFridgeData, содержащий Struct для декодирования ответаJSON:

// MARK: - CheckerFridge
struct CheckerFridgeData: Codable {
    let status: Int
    let product: Product?
}

// MARK: - Product
struct Product: Codable {
    let additivesTags: [String]?
    let productNameFr: String?
    let imageSmallURL, imageFrontSmallURL: String?
}

Когда я использую свой запрос к моему коду, у меня нет ошибки, но мой ответJSON return nil

CheckerFridgeData(status: 1, product: Optional(Checker_Fridge.Product(additivesTags: nil, productNameFr: nil, imageSmallURL: nil, imageFrontSmallURL: nil)))

Но если я напечатаю response.result.value as Any, код возвращает значение JSON.

У вас есть идея, почему я не могу декодировать мою структуру с данными JSON?

Большое спасибо за вашу помощь

1 Ответ

0 голосов
/ 21 июня 2019

Я думаю, что проблема в пользовательских типах.Если вы хотите конвертировать пользовательские типы, вам нужно использовать протокол CodingKeys.Когда я посмотрел ваш json, там нет такого свойства, как additivesTags, есть additives_tags, поэтому вы должны использовать CodingKeys, как показано ниже.

struct Product: Codable {
    let additivesTags: [String]?
    let productNameFr: String?
    let imageSmallURL, imageFrontSmallURL: String?

    enum CodingKeys: String, CodingKey {
        case additivesTags = "additive_tags"
        case productNameFr = "product_name_fr"
        case imageSmallURL
    }
}
...