Разбор вложенного JSON в Haskell с помощью Aeson - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь выучить библиотеку Aeson в Хаскеле.Прямо сейчас я пытаюсь проанализировать простой файл JSON, который выглядит следующим образом

{
    "Meta Data": {
        "1: Symbol": "MSFT",
        "2: Indicator": "Relative Strength Index (RSI)",
        "3: Last Refreshed": "2018-10-15",
        "4: Interval": "weekly",
        "5: Time Period": 10,
        "6: Series Type": "open",
        "7: Time Zone": "US/Eastern Time"
    },
    "Technical Analysis: RSI": {
        "2018-10-15": {
            "RSI": "54.5653"
        },
        "2018-10-12": {
            "RSI": "63.0279"
        },
        "2018-10-05": {
            "RSI": "74.7519"
        },
        "2018-09-28": {
            "RSI": "72.1573"
        },
        "2018-09-21": {
            "RSI": "74.8123"
        },
        "2018-09-14": {
            "RSI": "66.7116"
        },
        "2018-09-07": {
            "RSI": "75.8051"
        },
..and so on

с помощью этого урока по Aeson Aeson: урок В частности, раздел «Вложенные записи»


Это то, что я получил до сих пор.

{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}

module Tesst where

import           Data.Aeson
import qualified Data.ByteString.Lazy as B
import           Data.Time
import           GHC.Exts
import           GHC.Generics
import           Network.HTTP.Conduit (simpleHttp)

data TechinicalAnalysis = TechinicalAnalysis {
                   name :: String,
                   date :: String,
                   rsi  :: String
                   } deriving (Show, Generic)


instance FromJSON TechinicalAnalysis where
  parseJSON = withObject "RSI Quote" $
    \o -> do
      rsiQuote <- o        .: "Technical Analysis: RSI"
      date     <- rsiQuote .: "2018-10-16"
      rsi      <- date     .: "RSI"
      return TechinicalAnalysis {..}


main :: IO ()
main = do
  putStrLn "Which ticker? "
  symbolToQuote <- getLine
  d <- (eitherDecode <$> simpleHttp ("https://www.alphavantage.co/query?function=RSI&interval=weekly&time_period=10&series_type=open&apikey==FI2KMCSDSAE&symbol=" ++ symbolToQuote)) :: IO (Either String TechinicalAnalysis)
  case d of
    Left e   -> print e
    Right qt -> print (rsi qt)

Моя цель здесь - получить последнюю ссылку "RSI" из файла JSON по ссылке,Я не уверен, как это сделать прямо сейчас, поэтому в целях тестирования я вручную нажал ключ "2018-10-16" в разделе parseJSON.


Ошибка msg Я запускаю код

    • Couldn't match type ‘unordered-containers-0.2.9.0:Data.HashMap.Base.HashMap
                             Data.Text.Internal.Text Value’
                     with ‘[Char]’
      Expected type: String
        Actual type: Object
    • In the ‘date’ field of a record
      In the first argument of ‘return’, namely ‘TechinicalAnalysis {..}’
      In a stmt of a 'do' block: return TechinicalAnalysis {..}
   |
27 |       return TechinicalAnalysis {..}
   |              ^^^^^^^^^^^^^^^^^^^^^^^

Что, по-моему, говорит мне, что ответ date, полученный от date <- rsiQuote .: "2018-10-15", не тот, который я ожидал.


Здесь Вы можете найти мои предыдущие квесты и то, что я позже выяснил как ответ (другой файл JSON, успешно проанализирован)

1 Ответ

0 голосов
/ 16 октября 2018

Я решил проблему.

То, что возвращает .:, имеет тип Object, а не String

Так что вместо этого

data TechinicalAnalysis = TechinicalAnalysis {
                   name :: String,
                   date :: String,
                   rsi  :: String
                   } deriving (Show, Generic)

Iна это

newtype TechinicalAnalysis = TechinicalAnalysis {
                   rsi  :: String
                   } deriving (Show, Generic)

и все заработало без проблем.

...