2017-09-30 11 views
0

Swift 4を使用してNASA画像API(latest docs here)を照会しようとしています。JSONPlaceholderでリクエストを設定してテストしました。 。すべて正常に動作していましたが、URLと対応するJSONデータ構造を切り替えると、「データが見つかりませんでした」というエラーが表示されます。SwiftでのJSONデコードに関する問題

私は、Postmanを使用してJSONが返されていることを確認し、JSONデータ構造を構築しました。

これはJSONをデコードする際の一般的なエラーですか、それともネットワーク要求のあるものですか?または、NASA APIを使用して何かが欠けていますか?以下は

let NASAURL = URL(string: "https://images-api.nasa.gov/search?q=moon") 
    let session = URLSession(configuration: .default) 
    let task = session.dataTask(with: NASAURL!) { (rdata, response, error) in 
     NSLog("Data Description: " + (rdata!.debugDescription) + "\nResponse: " + response.debugDescription + "\nError Description: " + error.debugDescription) 

     guard rdata != nil else{ 
      NSLog("No data") 
      return 
     } 
     guard error == nil else{ 
      NSLog(response.debugDescription + "\n") 
      NSLog(error.debugDescription) 
      NSLog(error.debugDescription) 
      return 
     } 
     let decoder = JSONDecoder() 
     do{ 
      NSLog(rdata.debugDescription) 
      let usr = try decoder.decode(Collect.self, from: rdata!) // Throws 
      NSLog(usr.href) 

     } catch { 
      NSLog("Error: " + error.localizedDescription) 
     } 
    } 
    task.resume() 

// Collect is in its own class/file 
struct Collect: Codable { 
    var href: String 
    //var items: [Items] 
} 

は、上記ログステートメントからのプリントアウトです...

2017-09-29 19:50:24.135288-0500 OpenNASA[16993:10774203] Data Description: 67669 bytes 
Response: Optional(<NSHTTPURLResponse: 0x60000003db00> { URL: https://images-api.nasa.gov/search?q=moon } { status code: 200, headers { 
    "Access-Control-Allow-Origin" = "*"; 
    "Cache-Control" = "public, max-age=300, s-maxage=600"; 
    "Content-Encoding" = gzip; 
    "Content-Length" = 9334; 
    "Content-Type" = "application/json; charset=UTF-8"; 
    Date = "Sat, 30 Sep 2017 00:48:11 GMT"; 
    Server = "nginx/1.4.6 (Ubuntu)"; 
    "Strict-Transport-Security" = "max-age=31536000"; 
    Vary = "Accept-Encoding"; 
    "access-control-allow-headers" = "Origin,Content-Type,Accept,Authorization,X-Requested-With"; 
    "access-control-allow-methods" = GET; 
} }) 
Error Description: nil 
2017-09-29 19:50:24.137324-0500 OpenNASA[16993:10774203] Optional(67669 bytes) 
2017-09-29 19:56:01.843750-0500 OpenNASA[16993:10774203] Error: The data couldn’t be read because it is missing. 
+0

Collect構造体をポーティングできますか? –

+0

エラー出力から '.localizedDescription'を削除すると(代わりに' 'Error:\(error)' 'を実行してください)、より詳細なエラーメッセージが表示されます。 – Hamish

答えて

1

あなたコード可能な、以下のようにする必要があります:

struct Collect: Codable { 
    var collection: Links 
} 
struct Links: Codable { 
    var links: [Href] 
} 

struct Href: Codable { 
    var href: String 
} 

あなたは以下のように呼び出す必要があります:

let usr = try decoder.decode(Collect.self, from: rdata!) // Throws 
let links = usr.collection.links 
for link in links { 
    print(link.href) 
} 
+0

それは、ありがとう! –

+0

これはすべてのデータを必要としていますか?またはそれのちょうど少しの部分 –

+0

ちょうど 'href'のために –

関連する問題