gpt4 book ai didi

json - Alamofire 使用 Struct 解码 JSON 响应时出错

转载 作者:行者123 更新时间:2023-11-30 10:41:29 26 4
gpt4 key购买 nike

我的 alamofire.request 有问题。响应为零,但我不明白为什么。

我的问题是:我使用 OpenFoodFacts 的 API,它适用于以下样式的网址:https://fr.openfoodfacts.org/api/v0/produit/3366321054229

我使用 Alamofire 获取带有协议(protocol)、 session 和服务的请求。

我的协议(protocol):

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

我的 session :

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 包含用于解码响应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?
}

当我使用我的代码请求时,我没有错误,但我的responseJSON返回nil

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

但是如果我打印 response.result.value as Any 代码将返回 JSON 值。

您知道为什么我无法使用 JSON 数据解码我的结构吗?

非常感谢您的帮助

最佳答案

我认为问题出在自定义类型上。如果您想转换自定义类型,则需要使用 CodingKeys 协议(protocol)。当我查看你的 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
}
}

关于json - Alamofire 使用 Struct 解码 JSON 响应时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56702599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com