2016-12-28 7 views
0

はJSONからスウィフト3に必要な情報にアクセスする本当の難しさを持って、関連するフィールドにアクセスするには、ここで私が持っているものです。Swift3 JSONの解析 - どのよう

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    let url = URL(string: "http://api.brewerydb.com/v2/beers?key=e3bdce7d0a80584c784cdc4b02459add&name=budweiser") 

    URLSession.shared.dataTask(with:url!) { (data, response, error) in 
     if error != nil { 
      print(error!) 

     } 
     else { 

      do { 

       let parsedData = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 
       // print(parsedData) 


       let dataLevel = parsedData["data"] as? NSDictionary 


       print(dataLevel) 

       let abv = dataLevel?["abv"] as? AnyObject 
       print(abv!) 




      } catch let error as NSError { 
       print(error) 
      } 
     } 

     }.resume() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

JSONファイルへのリンクです私のコードはなぜ 'データ'セクションを返さないのですか?ビールの名前、abv、および説明を取得するにはどうしたらいいですか?私の構造と私が扱っていたデータの種類を理解大いに役立つ jsonformatter.curiousconcept.com または jsonlint.com :あなたはJSONを扱うとき

+0

'parsedData [" data "]'は辞書ではありません。これは辞書の配列です。コードが少ないabvを取得してください。 – Moritz

+0

ああ。 Thanks @ EricAya - 名前とabvが入っている辞書にどうすればアクセスできますか? –

+0

ここの例:http://stackoverflow.com/a/37343547/2227743他にもたくさんの例がありますが、これは既に多くの人に尋ねられています。 :) – Moritz

答えて

0

私はのようなツールを使用すると便利だと思います。

あなたはJSONを見ればあなたは、エリックアヤが言ったように、データが配列でない辞書であることに気づくことができるで:

{ 
    "currentPage": 1, 
    "numberOfPages": 1, 
    "totalResults": 1, 
    "data": [{ 
     "id": "1P45iR", 
     "name": "Budweiser", 
     "nameDisplay": "Budweiser", 
     "description": "Known as \u201cThe King of Beers\u201d, Budweiser was first introduced by Adolphus Busch in 1876 and is brewed with the same high quality standards today. Budweiser is a medium-bodied, flavorful, crisp American-style lager, craft brewed with a blend of premium hop varieties, and associated with the core American values of celebration and optimism.", 
     "abv": "5", 
     "glasswareId": 5, 
     "srmId": 5, 
     "availableId": 1, 
     "styleId": 93, 
     "isOrganic": "N", 
     "labels": { 
      "icon": "https:\/\/s3.amazonaws.com\/brewerydbapi\/beer\/1P45iR\/upload_Y13vwL-icon.png", 
      "medium": "https:\/\/s3.amazonaws.com\/brewerydbapi\/beer\/1P45iR\/upload_Y13vwL-medium.png", 
      "large": "https:\/\/s3.amazonaws.com\/brewerydbapi\/beer\/1P45iR\/upload_Y13vwL-large.png" 
     }, 
     "status": "verified", 
     "statusDisplay": "Verified", 
     "servingTemperature": "cold", 
     "servingTemperatureDisplay": "Cold - (4-7C\/39-45F)", 
     "createDate": "2012-01-03 02:42:55", 
     "updateDate": "2016-03-21 19:54:11", 
     "glass": { 
      "id": 5, 
      "name": "Pint", 
      "createDate": "2012-01-03 02:41:33" 
     }, 
     "srm": { 
      "id": 5, 
      "name": "5", 
      "hex": "FBB123" 
     }, 
     "available": { 
      "id": 1, 
      "name": "Year Round", 
      "description": "Available year round as a staple beer." 
     }, 
     "style": { 
      "id": 93, 
      "categoryId": 8, 
      "category": { 
       "id": 8, 
       "name": "North American Lager", 
       "createDate": "2012-03-21 20:06:46" 
      }, 
      "name": "American-Style Lager", 
      "shortName": "American Lager", 
      "description": "Light in body and very light to straw in color, American lagers are very clean and crisp and aggressively carbonated. Flavor components should b e subtle and complex, with no one ingredient dominating the others. Malt sweetness is light to mild. Corn, rice, or other grain or sugar adjuncts are often used. Hop bitterness, flavor and aroma are negligible to very light. Light fruity esters are acceptable. Chill haze and diacetyl should be absent.", 
      "ibuMin": "5", 
      "ibuMax": "13", 
      "abvMin": "3.8", 
      "abvMax": "5", 
      "srmMin": "2", 
      "srmMax": "4", 
      "ogMin": "1.04", 
      "fgMin": "1.006", 
      "fgMax": "1.01", 
      "createDate": "2012-03-21 20:06:46", 
      "updateDate": "2015-04-07 15:39:26" 
     } 
    }], 
    "status": "success" 
} 

次のコードは動作しますが、私はより良い方法があると確信しています

override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     let url = URL(string: "http://api.brewerydb.com/v2/beers?key=e3bdce7d0a80584c784cdc4b02459add&name=budweiser") 

     URLSession.shared.dataTask(with:url!) { (data, response, error) in 
      if error != nil { 
       print(error!) 

      } 
      else { 

       do { 

        let parsedData = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: Any] 


         let jsonArrayData = parsedData?["data"] as! NSArray 
         let data = jsonArrayData[0] as! NSDictionary 
         let abv = data["abv"] 
         print(abv)//Optional(5) in your case 


       } catch let error as NSError { 
        print(error) 
       } 
      } 

      }.resume() 
    } 
+0

ありがとう@mat本当にそれを感謝します!治療をしなさい。また、SwiftyJsonをインポートして別の方法で試してみたところ、次のようになっていました。 parseddataを使って[データ] [0] [abv] ありがとうございました! –

+0

@BarronAceはうまくいっていることを聞いてうれしいです。それがあなたを助けたら答えを受け入れることができますか?ありがとう! – mat