#json #haskell #aeson
#json #хаскелл #эсон
Вопрос:
Я создал свою собственную функцию parseJSON для своего типа оценки. К сожалению, я получаю ошибки компиляции из-за отсутствия «общей» версии Valuation, и я не уверен, что с этим делать. Я прочитал и перечитал столько руководств aeson, сколько смог, и, похоже, ни в одном из них это не упоминается. Я сделал свой тип оценки экземпляром класса FromJSON и предоставил собственную реализацию функции parseJSON, но по какой-то причине компилятор, похоже, думает, что это реализация другой функции parseJSON , и я не знаю, почему или как это исправить. Любая помощь была бы очень признательна.
C:UsersJohnGitHubhaskell_projectslearningsrcLib.hs:17:10 : ошибка: * Нет экземпляра для (GHC.Generics.Общая оценка), возникающая в результате использования
aeson-0.11.2.1:Data.Aeson.Types.Class.$dmparseJSON'
parseJSON’: parseJSON = aeson-0.11.2.1:Данные.Эсон.Типы.Class.$ dmparseJSON В объявлении экземпляра для `оценки FromJSON»
* In the expression:
aeson-0.11.2.1:Data.Aeson.Types.Class.$dmparseJSON
In an equation for— При обучении сборке пакета -0.1.0.0 с использованием: C:UsersJohnAppDataRoamingstacksetup-exe-cachex86_64-windowssetup-Simple-Cabal-1.24.0.0-ghc-8.0.1.exe —builddir=.stack-workdist b7fec021 библиотека сборки: learning exe:learning-exe —ghc-options Процесс » -ddump-hi-ddump-to-file» завершен с кодом: ошибка выхода 1
Вот код:
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedStrings #-}
{- The DuplicateRecordFields language extension allows records to use the same name for field labels. Without it, all the records in this module would need to have unique names for all their fields.
-}
module Lib
( someFunc,
) where
import Data.Time.Calendar
import Control.Lens
import Data.Aeson.Lens (_String, _Object, key)
import Network.Wreq
import Data.Aeson (Value(..), FromJSON, (.:), (.=), withObject)
data Valuation = Valuation {valued_on :: Day, price :: Double}
instance FromJSON Valuation where
parseJSON = withObject "valuation" $ o -> do
query <- o .: "query"
results <- query .: "results"
quote <- results .: "quote"
price <- quote .: "Open"
return Valuation{valued_on=today, price=price}
Комментарии:
1. Есть ли вероятность, что вы не сделали отступ
parseJSON
и его тело дальше, чем строка сinstance FromJSON Valuation where
? Если это так, то сообщение об ошибке будет иметь смысл, поскольку подпись по умолчаниюparseJSON
полагается наGeneric
…2. Я перепроверил, и моя догадка оказалась верной: вам просто нужно сделать отступ
parseJSON
и его тело дальше. Кроме того, вам необходимо импортировать методыFromJSON
too, добавив a(..)
послеFromJSON
в инструкции import . Наконец, у вас проблема, потому что нет такой функции, какtoday :: Day
.3. Вау. Большое вам за это спасибо. Вы были абсолютно правы. Я сделал отступ в функции parseJSON, и это отсортировало ошибку компиляции. Я забыл вставить функцию today.
4. Как помощник для других, идущих тем же путем. Мне также нужно было изменить импорт из JSON на: импорт данных. Aeson (Значение(..), изjson(..), (.:), (.=), С объектом) Без этого изменения я получаю следующую ошибку:
parseJSON' is not a (visible) method of class
FromJSON’5. Что ж, спасибо @torrlane — мне, по-видимому, нужно
ToJSON (..)