2017-10-07 3 views
-4

J'ai JSON prévisions météo et je nouvelle méthode à Swift 4 à sérialisation JSON avec la structure, mais le problème est que je recevrai quand je veux imprimer JSON:qu'est-ce qui ne va pas dans l'obtention de JSON dans SWIFT 4?

typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array but found a dictionary instead.", underlyingError: nil))

Voici mes codes pour JSON :

struct currently : Decodable { 
let summary : String? 
let temperature : Float? 
let timezone : String 

init(json : [String : Any]) { 

    summary = json["summary"] as? String ?? "" 
    temperature = json["temperature"] as? Float ?? -1 
    timezone = json["timezone"] as? String ?? "" 



} 
} 

Et voici le code pour obtenir JSON:

let jsonURL = "https://api.darksky.net/forecast/[code]/\(ViewController.latitude),\(ViewController.longitude)" 

    guard let url = URL(string : jsonURL) else { 
     return 
    } 

    URLSession.shared.dataTask(with: url) { (data , response , error) in 

     guard let data = data else {return} 

     do { 


      let currentlies = try JSONDecoder().decode(currently.self , from : data) 


      print(currentlies.timezone) 
      print(currentlies.summary) 
      print(currentlies.temperature) 

     } 

     catch { 

      print(error) 
     } 
    }.resume() 
+4

L'erreur est claire. Votre racine JSON est un dictionnaire mais vous le traitez comme un tableau. – rmaddy

+0

alors comment puis-je utiliser le dictionnaire dans swift 4? –

+1

"comment puis-je utiliser dictionnaire dans swift 4" recherche que dans google – Siyavash

Répondre

2

Vous pouvez utiliser comme ceci:

struct Response : Decodable { 
    let timezone : String 
    let currently: Currently 
} 

struct Currently: Decodable { 
    let summary: String 
    let temperature: Double 
} 

let jsonURL = "https://api.darksky.net/forecast/[code]/\(ViewController.latitude),\(ViewController.longitude)" 

guard let url = URL(string : jsonURL) else { 
    return 
} 

URLSession.shared.dataTask(with: url) { (data , response , error) in 
    guard let data = data else {return} 
    do { 
     let currentlies = try JSONDecoder().decode(Response.self , from : data) 

     print(currentlies.timezone) 
     print(currentlies.currently.summary) 
     print(currentlies.currently.temperature) 
    } catch { 
     print(error) 
    } 
}.resume() 
+0

c'est vrai c'est Ce que je voulais savoir merci beaucoup –