2017-02-08 11 views
0

現在、私はJSONデータから値を返そうとしていますが、値の1つがnullを返してアプリがクラッシュする問題が発生しています。私はこの時点に良いされているJSONオブジェクトマッパーGlossを使用していjson配列の値がnullを返す場合、次のnullでないjson値を返す方法は?

"results": [ 
    { 
     "genre_ids": [ 
     99 
     ], 
     "id": 440108, 
     "poster_path": null, //The value that's causing incredible headaches! 
    }, 
    { 

     "genre_ids": [ 
     99, 
     10402 
     ], 
     "id": 391698, 
     "poster_path": "/uv7syi4vRyjvWoB8qExbqnbuCu5.jpg",//The value trying to get! 
    }, 

] 

これは、JSONのように見えるものです。ここで私は私のオブジェクトがセットアップされている方法です。

public struct ResultsGenrePosters: Decodable { 

    public let results : [GenrePosters]? 

    public init?(json: JSON) { 
    results = "results" <~~ json 
    } 
} 

public struct GenrePosters: Decodable, Equatable{ 

    public let poster : String 

    public init? (json: JSON) { 

    guard let poster: String = "poster_path" <~~ json 
     else {return nil} 
    self.poster = poster 
    } 
    public static func ==(lhs: GenrePosters, rhs: GenrePosters) -> Bool { 
    return lhs.poster == rhs.poster 
    } 


    static func updateGenrePoster(genreID: NSNumber, urlExtension: String, completionHandler:@escaping (_ details: [String]) -> Void){ 

    let nm = NetworkManager.sharedManager 

    nm.getJSONData(type:"genre/\(genreID)", urlExtension: urlExtension, completion: { 
     data in 

     if let jsonDictionary = nm.parseJSONData(data) 
     { 
     guard let genrePosters = ResultsGenrePosters(json: jsonDictionary) 

      else { 
      print("Error initializing object") 
      return 
     } 

     guard let posters = genrePosters.results 

      else { 
      print("No poster exists for genre: \(genreID)")// This keeps on triggering when the null object is hit, this is where it would be good to move to the next array to get that value 
      return 
     } 

     let postersArray = posters.map {$0.poster}// converts custom object "GenrePosters" to String(poster value) 
     completionHandler(postersArray) 
     } 
    }) 
    } 
} 
+0

この変数は??を使用して確認できます。 Ex var strData = nil starData = strData ?? "" –

答えて

0
guard let poster: String = "poster_path" <~~ json 

(もちろん、あなたが、私は何も知らないライブラリを使用しているので、ライブラリがクラッシュすることができ

guard let poster = ("poster_path" <~~ json) as? String 

でなければなりません。 JSONSerializationはあなたの友人です。それは動作します。誰もが何をしているか知っています)。

0
for data in results as! [Dictionary<String,AnyObjects>]{ 
    var value1 = data["key"] as? String 
    if value1 == nil{value1 = ""}else{} 
    } 
    } 
    That was just a simple logic but completely work for me all the time. :) 
+1

ようこそスタックオーバーフロー! [ツアー](http://stackoverflow.com/tour)を見て回り、[ヘルプセンター](http://stackoverflow.com/help)を読んでください。特に [どうすればいいですか?良い答えを書くか?](http://stackoverflow.com/help/how-to-answer)。コードが何をし、なぜそれが問題を解決するのかを説明するテキストを追加してください。 –

関連する問題