嵌套枚举类型的ToJSON和FromJSON实例

时间:2014-08-05 21:09:10

标签: haskell enums aeson

我目前正在包装Rest(ish)API。 JSON看起来像这样,但更广泛:

{ 'a' : 'Bar1 Bar1B' }
{ 'a' : 'Bar2 Bar2A' }

这似乎很好地代表了Enum类型。例如:

data Foo = Foo { a :: Bar }

data Bar = Bar1 Bar1 | Bar2 Bar2

data Bar1 = Bar1A | Bar1B

data Bar2 = Bar2A | Bar2B

我遇到两个问题。

虽然我可以很容易地编写ToJSON实例:

instance ToJSON Bar1 where
         ToJSON Bar1A = String "Bar1A"
         ToJSON Bar1B = String "Bar1B"

当我编写相应的FromJSON实例时,它们无法解码:

instance FromJSON Bar1 where
         parseJSON (String "Bar1A") = return Bar1A
         parseJSON (String "Bar1B") = return Bar1B
         parseJSON _ = mzero

为什么会这样?

其次,这似乎涉及到我写了大量的样板文件。有没有办法解决?例如,使用Show / Read或模板haskell?

1 个答案:

答案 0 :(得分:3)

您无法解码裸Bar1A值,因为裸字符串无效JSON。顶层只允许使用数组或对象。

使用-XDeriveDataTypeable,您在这里讨论的简单示例的派生实例非常简单。有关详细信息,请参阅the Aeson docs