我见过的每个示例ToJSON
都FromJSON
适用于具有单个构造函数的数据类型,如下所示:
data RewindConfig = RConfig JobID Phase
deriving Show
instance FromJSON RewindConfig where
parseJSON (Object o) = RConfig
<$> o .: "JobID"
<*> o .: "Phase"
parseJSON _ = fail "invalid RewindConfig"
我想我会看看 Aeson 如何为具有多个构造函数的类型创建实例,例如Either
:
instance (FromJSON a, FromJSON b) => FromJSON (Either a b) where
parseJSON (Object (H.toList -> [(key, value)]))
| key == left = Left <$> parseJSON value
| key == right = Right <$> parseJSON value
parseJSON _ = fail ""
parseJSON 中的模式匹配让我感到困惑,我不明白(H.toList -> [(key, value)])
.
我要为其创建实例的数据类型如下所示:
data Foo = Bar String
| Baz String
| Bin String
我确实想到了做一些我知道如何实施的事情
data Foo = (Maybe Bar) (Maybe Baz) (Maybe Bin)
但这似乎并不令人满意。有人可以通过解释Either
实例的情况来帮助我吗,或者给我一些关于 To/From 实例的指导Foo
?
更新:我认为 Aeson 实现的实例Maybe
更加清晰,并告诉我我需要知道什么来满足我的需求。不过,我想知道发生了什么Either
。