使用 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)
我正在尝试在 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)