Search code examples
jsonhaskelltraversalwreq

Traversing JSON in Haskell with wreq - key issues


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.


Solution

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

    {
        "city":{
            "id":1851632,
            "name":"Shuzenji",
            ...
            }
        "cod":"200",
        ...
    }