我想解析外部json,其中valgrind
和RequestItem
可以显示在同一位置。我提供了以下编码,其中每个变量都定义为单独的数据类型:
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
吗?
一个限制:我不想手工编写解析器,而是使用通用派生。
答案 0 :(得分:3)
data Item
= RequestItem { name :: String }
| FolderItem { item :: [Item] }
deriving Generic
instance FromJSON Item where
parseJSON = genericParseJSON defaultOptions{sumEncoding = UntaggedValue}