Search code examples
iosjsonswiftswift3alamofire

Alamofire can't access keys of json response


I'm new to using Alamofire and have encountered an issue. I'm able to run the following code to print out all the data from an API endpoint.

Alamofire.request("http://codewithchris.com/code/afsample.json").responseJSON { response in
    if let JSON = response.result.value {
        print(JSON)
    }
}

The issue is that when I run this:

Alamofire.request("http://codewithchris.com/code/afsample.json").responseJSON { response in
    if let JSON = response.result.value {
        print(JSON["firstkey"])
    }
}

I get the error:

Type 'Any' has no subscript members

I don't know why this error is happening, it seems as if I'm accessing the data correctly. Any help would be great, thanks!

I have tried formatting it using both:

print(JSON["firstkey"] as String)

and

print(JSON["firstkey"] as [String:Any]

but they still give the same error.

This is the JSON on my endpoint:

{
    "firstkey":"it worked!",
    "secondkey":["item1", "item2", "item3"]
}

Solution

  • This is really simple. You just need to force cast (as!) your JSON. so change your code to this and it will work:

    Alamofire.request("http://codewithchris.com/code/afsample.json").responseJSON { response in
        if let JSON = response.result.value {
            let json = JSON as! [String: Any]
            print(json["firstkey"])
        }
    }
    

    Edit 1: As you said in comments that you are using SwiftyJSON package. Sample code is as follows:

    Alamofire.request("http://codewithchris.com/code/afsample.json").responseJSON { response in
            if let value = response.result.value {
                let json = JSON(value)
                print(json["firstkey"].stringValue)
            }
        }
    
    Alamofire.request("https://mmcalc.com/api").responseJSON { response in
            if let value = response.result.value {
                let json = JSON(value)
                print(json.arrayValue[0]["uniqueUsers"].stringValue)
            }
        }