Разобрать тип суммы без тегов с aeson - PullRequest
0 голосов
/ 31 декабря 2018

Я хочу проанализировать внешний json, где 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 и FolderChoice?

Одно ограничение: я не хочу писать парсер вручную, а использую обобщенный вывод.

1 Ответ

0 голосов
/ 31 декабря 2018

Попробуйте параметр UntaggedValue :

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

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