如何从 openFoodFacts JSON(Swift) 解码

How do I decode from openFoodFacts JSON(Swift)

我对从 JSON 文件解码还很陌生。

我的问题是,我如何解码才能找到这个:"product_name_en": "Coca Cola"(那个文件还有很多,但不是节点)

我的结构设置为:

struct ParseStructs : Decodable {

   var product_name_en : String

}

我的检索代码是:

var testCall = "https://world.openfoodfacts.org/api/v0/product/5449000000996.json"



func request(urlString : String ){

    if let url = URL(string: urlString){

        let session = URLSession(configuration: .default)

        let task = session.dataTask(with :url) { (data , response , error) in

            if(error != nil){
                print(error!)
            }

                if let safeData = data{

                    print(safeData)
                    self.parseFunc(inputData: safeData)
                }

        }
        task.resume()
    }

}


func parseFunc(inputData : Data){

    let decoder = JSONDecoder()


    do{
    let decode = try decoder.decode(ParseStructs.self, from: inputData)
        print(decode)
    }catch{
        print(error)
    }

}

我只是 运行 从终端行进入这个可爱的问题: 71733 字节

keyNotFound(CodingKeys(stringValue: "product_name_en", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"product_name_en\", intValue: nil) (\"product_name_en\").", underlyingError: nil))

我注意到很多这样的问题都遭到反感,但如有任何帮助,我们将不胜感激。

您的结构采用以下 JSON 结构:

{
    "product_name_en": "Coca Cola"
}

而实际上您感兴趣的数据包装在另一个对象中:

{
    "product": {
        "product_name_en": "Coca Cola"
    }
}

通常,您可以通过定义另一个中间结构来解决此问题:

struct Product: Decodable {
    var product_name_en: String
}

struct ProductWrapper: Decodable {
    var product: Product
}

然后在您的 parseFunc 函数中对其进行解码:

let decoded = try decoder.decode(ProductWrapper.self, from: inputData)
let product = decoded.product

还有其他方法可以解决此问题,请查看 this awesome guide 的 "Dealing with Object Wrapping Keys" 部分。