Как мне декодировать из openFoodFacts JSON (Swift) - PullRequest
1 голос
/ 06 апреля 2020

Я довольно новичок в декодировании из файла 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: "Нет значения, связанного с ключом CodingKeys (stringValue: \" product_name_en \ ", intValue: nil) (\" product_name_en \ " ). ", underError: nil))

Я заметил, что многие из этих вопросов не нравятся, но любая помощь приветствуется.

1 Ответ

2 голосов
/ 06 апреля 2020

Ваша структура предполагает следующую структуру 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

Существуют и другие способы обойти эту проблему, посмотрите Раздел "Работа с ключами обтекания объектов" этого замечательного руководства .

...