Codable protocol (JSON & API)

Bonjour à la communauté ! Je galère en m’essayant aux API !
J’aimerais extraire la “formate_address” de ce JSON pour la faire apparaitre sur un label (en mode entrainement):
https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=

voilà ce que je fais dans le view controller :

  let requestTest = "https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key="
        
        guard let urlRequest = URL(string: requestTest) else { return }
        
        URLSession.shared.dataTask(with: urlRequest) { data, response, error in
            if error != nil {
                print(error!.localizedDescription)
            }
            
            guard let jsonData = data else { return }
            
            let decoder = JSONDecoder()
            do {
               
                let resultats = try decoder.decode(ResultsJson.Results.self, from: jsonData)
                
                self.ui_adressLabel.text = resultats.formatted_address
                
            } catch let jsonError {
                print(jsonError)
            }
        }.resume()

Et dans un autre fichier swift la structure :

struct ResultsJson: Codable {
let results:[Results]
let status:String

struct Results: Codable {
    let address_components:[AddressComponents]
    let formatted_address:String
    let geometry:Geometry
    let place_id:String
    let types:String
    
    struct AddressComponents: Codable {
        let long_name:String
        let short_name:String
        let types: [String]
    }
    
    struct Geometry: Codable {
        let bounds:BoundsOrViewport
        let location:Location
        let location_type:String
        let viewport:BoundsOrViewport
        
        struct Location: Codable {
            let lat:Float
            let lng:Float
        }
        
        struct BoundsOrViewport: Codable {
            let northeast:Location
            let southest:Location
        }
        
    }
}

}

et voilà l’erreur :
CodingKeys in _F1EC8C7B495EEA52EBEE1EAAF2933887).address_components, Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key address_components (“address_components”)

Je remercie par avance le master Ken qui aura la solution, déjà des jours que je lis tous les tutos avec mon anglais modéré, et naturellement j’en chie.

Cordialement

SC

Salut,

Visiblement il 'a pa l’air de pouvoir remplir ta structure AdressComponents avec le JSON que tu lui fourni, vérifie bien la strucutre de ton JSON, ou utilise des optionnel .
Ceci devrai donc marcher:

let address_components:[AddressComponents]?

j’ai essayé mais j’ai du me planter quelque part parceque ça ne marche toujours pas…
voilà la structure du JSON :
{
“results” : [
{
“address_components” : [
{
“long_name” : “Google Building 42”,
“short_name” : “Google Bldg 42”,
“types” : [ “premise” ]
},
{
“long_name” : “1600”,
“short_name” : “1600”,
“types” : [ “street_number” ]
},
{
“long_name” : “Amphitheatre Parkway”,
“short_name” : “Amphitheatre Pkwy”,
“types” : [ “route” ]
},
{
“long_name” : “Mountain View”,
“short_name” : “Mountain View”,
“types” : [ “locality”, “political” ]
},
{
“long_name” : “Santa Clara County”,
“short_name” : “Santa Clara County”,
“types” : [ “administrative_area_level_2”, “political” ]
},
{
“long_name” : “California”,
“short_name” : “CA”,
“types” : [ “administrative_area_level_1”, “political” ]
},
{
“long_name” : “États-Unis”,
“short_name” : “US”,
“types” : [ “country”, “political” ]
},
{
“long_name” : “94043”,
“short_name” : “94043”,
“types” : [ “postal_code” ]
}
],
“formatted_address” : “Google Bldg 42, 1600 Amphitheatre Pkwy, Mountain View, CA 94043, États-Unis”,
“geometry” : {
“bounds” : {
“northeast” : {
“lat” : 37.42198310000001,
“lng” : -122.0853195
},
“southwest” : {
“lat” : 37.4214139,
“lng” : -122.0860042
}
},
“location” : {
“lat” : 37.4216548,
“lng” : -122.0856374
},
“location_type” : “ROOFTOP”,
“viewport” : {
“northeast” : {
“lat” : 37.4230474802915,
“lng” : -122.0843128697085
},
“southwest” : {
“lat” : 37.4203495197085,
“lng” : -122.0870108302915
}
}
},
“place_id” : “ChIJPzxqWQK6j4AR3OFRJ6LMaKo”,
“types” : [ “premise” ]
}
],
“status” : “OK”
}

merde ça met un JSON tout mal indenté !
bon, voilà le lien :
https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=

et la structure entière des résultats qui va avec :

struct ResultsJson: Codable {
let results:[Results]
let status:String

struct Results: Codable {
    let address_components:[AddressComponents]?
    let formatted_address:String
    let geometry:Geometry
    let place_id:String
    let types:String
    
    struct AddressComponents: Codable {
        let long_name:String
        let short_name:String
        let types: [String]
    }
    
    struct Geometry: Codable {
        let bounds:BoundsOrViewport
        let location:Location
        let location_type:String
        let viewport:BoundsOrViewport
        
        struct Location: Codable {
            let lat:Float
            let lng:Float
        }
        
        struct BoundsOrViewport: Codable {
            let northeast:Location
            let southest:Location
        }
        
    }
}

}

bordel il manque ça au dessus de Results :

struct ResultsJson: Codable {
let results:[Results]
let status:String

Effectivement tous à l’air correct, hmmm bizar. On a du louper quelque chose de tous bêtes.

AAAAAAAAAAAA sa y’aiiiii j’aiiii trouvéééééééé. enfin j’espère,
en fait je croi que l’erreur se situe ici :

let resultats = try decoder.decode(ResultsJson.Results.self, from: jsonData)

faudrai tester avec:

let resultats = try decoder.decode(ResultsJson.self, from: jsonData)

Du coup sa sert a rien de mettre une optionel

oui les optionnelles ne sont pas lues,
du coup j’ai modifié la structure, ajouté des coding keys mais bordel toujours pas !

mais on s’en rapproche parceque now l’erreur c’est :

“No value associated with key southest (“southest”).”

je vais essayer des codingKeys sur BoundsOrViewport

bon bah même après avoir ajouter des CodingKeys partout, je ne trouve toujours pas… il va falloir attendre l’intervention du Maxime

Salut Stéphane, je ne pense pas nécéssaire d’avoir rajouté les coding keyz, tu peu nous dire ce que le compilateur de dit ? Tkt on va trouvé

Bon j’ai fini par lâcher l’affaire, je suis repassé en mode JSONSerialization, merci quand même Samir