У меня есть данные в виде пар из двух строк, где первая - это ключ, идентифицирующий форму JSON, доставленного как вторая.
fooooo
{"a": 123}
barrrr
{"a": 123, "b": 123}
fooooo
{"a": 123}
Я хотел бы проанализировать его для тех же данных тип на основе fopooo
, baasdasda1
, и т. д. c:
data Test
= Foo
{ a :: Int
, b :: Int
}
| Bar
{ a :: Int
}
deriving (Show, Generic)
В Aeson есть функция тега , но она Кажется, требуется наличие тега внутри объекта.
Есть ли способ справиться с этим, например (с тегом снаружи)
magicDecode :: String -> Test
magicDecode "fooooo" = decodeSpecyfic Foo
magicDecode "barrrr" = decodeSpecyfic Bar
Или что-то похожее на него ?
edit1
У меня есть множество функций для обработки типов с записями этим
test :: [(String, Text)]
test =
[ ("foooo", "Foo")
, ("barrr", "Bar")
, ("aaaa", "Lel")
]
dec :: String -> ByteString -> Test
dec t x =
fromJust $
parseMaybe
(genericParseJSON defaultOptions {sumEncoding = ObjectWithSingleField})
(object [fromJust (lookup t test) .= fromJust (decode x :: Maybe Value)])
(Проблема в том, что если у вас нет параметров конструктора :()