使用 Aeson 从 Haskell 中的 URL 解析 JSON 数据

Parsing JSON data from a URL in Haskell using Aeson

我正在尝试在 Haskell 中创建一个 Web 应用程序,它从 URL.

获取一些 JSON 输入
{-# LANGUAGE OverloadedStrings, DeriveGeneric #-}

import Data.Aeson as Q
import Data.Text
import Control.Applicative
import Control.Monad
import qualified Data.ByteString.Lazy as B
import Network.HTTP.Conduit (simpleHttp)
import GHC.Generics
--import Data.DateTime

data Temperatures = 
  Temperatures { date :: String
               , temperature :: Int
                 } deriving (Show, Generic)

instance FromJSON Temperatures
instance ToJSON Temperatures


jsonURL :: String
jsonURL = "http://www.phoric.eu/temperature"

getJSON :: IO B.ByteString
getJSON = simpleHttp jsonURL


main :: IO ()
main = do 
 d <- (eitherDecode <$> getJSON) :: IO (Either String Temperatures)
 case d of
  Left e   -> putStrLn e
  Right stuff -> print stuff

但是,我在运行时遇到错误:

Bradley$ runhaskell test.hs
The key "date" was not found

JSON 在代码中的 URL 下面。

{"temperatures":[
    {"date":"2015-02-28T20:16:12+00:00", "temperature":0},
    {"date":"2015-01-01T21:46:55+00:00", "temperature":2}, 
    {"date":"2015-04-08T21:46:53+00:00", "temperature":3},
    {"date":"2015-04-09T21:46:01+00:00", "temperature":4},
    {"date":"2015-04-10T21:46:40+00:00", "temperature":5},
    {"date":"2015-04-11T21:46:36+00:00", "temperature":6},
    {"date":"2015-04-12T20:36:25+00:00", "temperature":7}
]}

我不知道为什么当键清楚地出现在 JSON 对象中时它不能识别键,有什么想法吗?

在当前形式中,您的代码只能解析形式为 {"date":"2015-04-12T20:36:25+00:00", "temperature":7} 的一行:它尝试将输入解析为 Temperatures,但找不到 [=13] =] 键进入根对象,因为它只有一个 temperatures 键。

问题是您的 Temperatures 数据类型与您的输入不匹配。这是应该匹配的内容:

data DataPoint = DataPoint { date :: String
                           , temperature :: Int
                           } deriving (Show, Generic)

data Temperatures = Temperatures { temperatures :: [DataPoint]
                                 } deriving (Show, Generic)