如何避免为Data.Tree创建孤立的FromJSON实例

时间:2013-10-12 16:29:21

标签: json haskell aeson

我正在使用aeson包。我有一个在其声明中使用Data.Tree的数据类型。如下所示,只是更复杂:

 data Foo = Foo {
               bat :: Text 
             , xux :: Maybe Text 
             , tri :: Tree Text
            }

我想使用Data.Aeson.TH为此类型生成FromJSON个实例。

$(deriveJSON defaultOptions ''Foo)

但是Data.Tree没有FromJSON的标准实例,这意味着我需要声明一个孤儿实例。

是否有某种方法可以避免创建该孤立实例,同时仍能使用deriveJSON

1 个答案:

答案 0 :(得分:4)

为了使实例成为规范(即不是孤儿),需要在类型构造函数(Data.Tree)或类声明(Data.Aeson.Types)的同一模块中定义它。因此,定义非孤立实例的唯一方法是fork aeson(因为aeson依赖于容器)。

我建议filing a ticket使用aeson,或者可能是拉取请求,以便将其添加到上游。在此之前,如果您不打算分发代码,定义孤立实例不会造成太大麻烦。如果您正在处理要发布的代码,最安全的解决方案是在Tree周围创建一个newtype包装器,然后为新类型创建一个FromJSON实例。