0

Having real difficulties accessing the info required in Swift 3 from a JSON, here's what I have:

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.
}

}

the link to the JSON file is in the code - why is my code not returning the 'data' section, and how could I retrieve the beer 'name', 'abv' and 'description'?

Duke Showbiz
  • 252
  • 1
  • 11
  • `parsedData["data"]` is not a dictionary, it's an array of dictionaries. – Eric Aya Dec 28 '16 at 00:30
  • ah. Thanks @EricAya - how then do I access the dictionary that name and abv are in? – Duke Showbiz Dec 28 '16 at 00:37
  • An example here: http://stackoverflow.com/a/37343547/2227743 There's many other examples, this has been asked and answered a lot already, please do some research. :) – Eric Aya Dec 28 '16 at 00:43

1 Answers1

0

When you deal with JSON I think it is helpful to use tools like: jsonformatter.curiousconcept.com or jsonlint.com which help me a lot understanding the structure and what kind of data I am dealing with.

If you look at your json in you can notice that, as Eric Aya said, data is an array not a dictionary:

{
    "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"
}

The following code works but I am sure there is a better way to get abv with less code:

 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()
    }
Mat
  • 6,236
  • 9
  • 42
  • 55
  • thanks @mat really appreciate it! Works a treat. Also tried it the other way importing SwiftyJson and then got to it just by: using parseddata[data][0][abv] thanks for your help! – Duke Showbiz Dec 29 '16 at 20:41
  • @BarronAce glad to hear that it worked. Can you please accept the answer if it helped you. Thanks! – Mat Dec 29 '16 at 20:43