Обход JSON в Haskell с помощью wreq - ключевые проблемы

Я пытаюсь пройти через некоторый JSON-ответ, который я получаю от OpenWeatherMap API, но у меня возникают проблемы с получением некоторых значений. Вот мой код:

{-# 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

Проблема в том, что возвращается только значение "cod" (в этом случае "200"). Значения для "name" и "id" отображаются как "", если мы попробуем с Лондоном, Великобритании, Чикаго, США (например). И все же тело ответа выглядит так:

{
   ...
   "id": 2643743,
   "name": "London",
   "cod": 200
}

Сначала я подумал, что это несоответствие типов, но 200 Int там (разве я ошибаюсь?), поэтому я не уверен, где проблема лежит? "" кажется, что эти 2 ключа (id а также name) не существует, но они есть.

Есть идеи? Заранее спасибо.

1 ответ

Решение

Тело ответа не выглядит так.

Согласно https://openweathermap.org/forecast5, ключ "cod" появляется на самом внешнем уровне объекта JSON, но "id" а также "name" не делайте.

{
    "city":{
        "id":1851632,
        "name":"Shuzenji",
        ...
        }
    "cod":"200",
    ...
}
Другие вопросы по тегам