2016-09-27 9 views
1

以下のようなJSONオブジェクトを使用すると、IOS関連のコンテンツのみをフィルタリングできますか?私はどのような方法、すなわちfor-inループまたは.filterにもオープンですか?私は、私は、プラットフォームのキーは、私はなるだろう。その場合には「IOS」に一致する、ある場合にのみコンテンツを返すことをフィルタリングしたいと思う例えばネストされた文字列の値に基づいてJSONをフィルタリングする

: 1B

  • タイトル1つの
  • 質問
  • IOS

難しさは、プラットフォームのマッチが成功した場合、タイトルのみを印刷する必要がある、と私は、ループ内のために定期的に入れ子になったでこれを達成する方法を見ることができないということです。

[ 
    { 
    "title": "Title 1", 
    "faqs": [ 
     { 
     "question": "question 1a", 
     "platform": "ANDROID" 
     }, 
     { 
     "question": "question 1b", 
     "platform": "IOS" 
     } 
    ] 
    }, 
    { 
    "title": "Title 2", 
    "faqs": [ 
     { 
     "question": "question 2a", 
     "platform": "ANDROID" 
     }, 
     { 
     "question": "question 2b", 
     "platform": "WEB" 
     } 
    ] 
    } 
] 

答えて

0

(スウィフト3)簡単な解決策、dataDataとしてJSON文字列である:

do { 
    if let jsonObject = try JSONSerialization.jsonObject(with:data, options: []) as? [[String:Any]] { 
     for item in jsonObject { 
     if let title = item["title"] as? String, 
      let faqs = item["faqs"] as? [[String:String]], 
      let iOSFaqs = faqs.filter({$0["platform"] == "IOS"}).first { 
      print(title) 
      print(iOSFaqs) 
     } 
     } 
    } 
    } catch let error as NSError { 
    print(error) 
    } 
+0

ありがとうございました。私は解決策が気に入っていますが、残念ながらSwift 3に更新することはできません。私はそれについて明白にすべきだった、申し訳ありません。 –

+0

Swift 2では、 'NSJSONSerialization.JSONObjectWithData(data、options:[])を試してみてください。'という小さな変更が1つあり、オプションのバインディングチェーンで2番目と3番目の 'let'を省略できます。 – vadian

0

あなたが辞書の配列をフィルタリングするNSPredicateを使用することができます。 例については、これらの古い質問を参照できます。これはちょうど「純粋な迅速な方法」ではありませんが、仕事を完了させます。コードはObjective Cにありますが、Swift構文に簡単に変換できます。助けが必要な場合は、後で回答を延長することができます。 Link 1 Link 2