2015-04-29 1 views
0

Я пытаюсь создать веб-приложение в Haskell, которое берет некоторый ввод JSON из URL-адреса.Анализ данных JSON из URL-адреса в Haskell с использованием Aeson

{-# 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, какие-либо идеи?

ответ

1

В своей нынешней форме, ваш код может только разобрать одну строку вида {"date":"2015-04-12T20:36:25+00:00", "temperature":7}: он пытается разобрать вход в Temperatures, но не может найти date ключ в корневой объект, поскольку он имеет только temperatures ключ.

Проблема в том, что ваш тип данных Temperatures не соответствует вашим данным. Вот что должно соответствовать:

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

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