I'm trying to traverse some JSON response I'm getting from the OpenWeatherMap API but I'm getting some issues to retrieve some values. Here is my code:
{-# LANGUAGE OverloadedStrings #-}
import Control.Lens
import Data.Aeson.Lens (_String, key)
import Network.Wreq
myAPIKey :: String
myAPIKey = "my_api_key_here"
conditionsQuery :: String -> String -> String -> String
conditionsQuery city country key = 
   "https://api.openweathermap.org/data/2.5/forecast?q=" ++ city ++ "," ++ country ++ "&appid=" ++ key
main = do
    print "What's the city?"
    city <- getLine
    print "And the country?"
    country <- getLine
    r <- get (conditionsQuery city country myAPIKey)
    print $ r ^. responseBody . key "name" . _String
    print $ r ^. responseBody . key "cod" . _String
    print $ r ^. responseBody . key "id" . _String
The issue is that only the value of "cod" is returned ("200" in that case).  The values for "name" and "id" appear as "", if we try with London,GB, Chicago, US (for instance). Yet the response body looks like:
{
   ...
   "id": 2643743,
   "name": "London",
   "cod": 200
}
I first thought it was a type mismatch, but 200 is an Int there (unless I'm mistaken?) so I am not sure where the issue lies? "" seems to indicate that those 2 keys (id and name) do not exist, but they do. 
Any ideas? Thanks in advance.
 
                        
The response body does not look like that.
According to https://openweathermap.org/forecast5, the key
"cod"appears at the outermost level of the JSON object, but"id"and"name"do not.