私は単純な ADT と戦ってきました。JSON との間で往復させようとしましたが、どのように型をマッサージしたり変更したりしようとしても、運がありませんでした。私は何が欠けていますか?
コンパイルすると、常に同じ実行時エラーが発生します。
> let t = Fahrenheit
> fromJSON $ toJSON t
Error "when expecting a (), encountered Object instead"
おそらく同じエラーが原因で、これを試しても「何もありません」と表示されます:decode $ encode t
これらのソースに従おうとしましたが、何を試しても、このランタイム エラーを回避できないようです: Haskell :: Aeson :: parse ADT based on field value https://www.fpcomplete.com/ユーザー/Geraldus/algebraic-data-types-adts-with-aeson
これが私が使用しているコードの1つの形式です。最初は、これを別の型に埋め込まれた型として使用しようとしましたが、それがうまくいかなかったときに、これを簡単に解析できるように「値」キーを追加しました (うまくいきませんでした)。
data TemperatureType = Celsius
| Fahrenheit
deriving (Show,Read,Typeable,Data,Eq)
-- This doesn't work either
-- $(deriveJSON defaultOptions ''TemperatureType)
instance ToJSON TemperatureType where
toJSON Fahrenheit = object [ "value" .= String "Fahrenheit" ]
toJSON Celsius = object [ "value" .= String "Celsius" ]
instance FromJSON TemperatureType where
parseJSON (Object x) = toTemperatureType <$> x .: "value"
toTemperatureType :: Text -> TemperatureType
toTemperatureType "Fahrenheit" = Fahrenheit
toTemperatureType "Celsius" = Celsius