用aeson解析未加标签的求和类型

时间:2018-12-31 13:33:16

标签: haskell aeson

我想解析外部json,其中valgrindRequestItem可以显示在同一位置。我提供了以下编码,其中每个变量都定义为单独的数据类型:

FolderItem

这可以简化为单个数据类型定义,从而消除data RequestItem = RequestItem { name :: String } deriving (Generic, Show) data FolderItem = FolderItem { item :: [Item] } deriving (Generic, Show) data Item = RequestChoice RequestItem | FolderChoice FolderItem deriving (Show) instance FromJSON Item where parseJSON = (\v -> asum [ RequestChoice <$> (genericParseJSON defaultOptions v), FolderChoice <$> (genericParseJSON defaultOptions v) ]) :: Value -> Parser Item RequestChoice吗?

一个限制:我不想手工编写解析器,而是使用通用派生。

1 个答案:

答案 0 :(得分:3)

尝试UntaggedValue option

data Item
  = RequestItem { name :: String }
  | FolderItem { item :: [Item] }
  deriving Generic

instance FromJSON Item where
  parseJSON = genericParseJSON defaultOptions{sumEncoding = UntaggedValue}