1

我目前正在包装一个 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?

4

1 回答 1

4

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

像您在这里谈论的简单示例的派生实例使用-XDeriveDataTypeable. 有关详细信息,请参阅Aeson 文档

于 2014-08-05T21:23:47.563 回答