我目前正在包装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?
答案 0 :(得分:3)
您无法解码裸Bar1A值,因为裸字符串无效JSON。顶层只允许使用数组或对象。
使用-XDeriveDataTypeable
,您在这里讨论的简单示例的派生实例非常简单。有关详细信息,请参阅the Aeson docs。