Как объединить объекты Aeson?
У меня есть список объектов Aeson, как это
[object ["key1" .= "value1"], object ["key2" .= "value2"]]
и я хочу объединить их в один объект Aeson, как это
object ["key1" .= "value1", "key2" .= "value2"]
Это вполне стандартно при работе с данными JSON на других языках (операция слияния), но я не вижу ничего подобного в библиотеке Aeson.
Я что-то упускаю, и можно ли это сделать с помощью какой-нибудь стандартной функции haskell? Я пытался с помощью sequence
но похоже что JSON Value
это не монада, поэтому я не могу этого сделать.
Мне не нужно иметь дело с глубоким слиянием или дублированием ключей, я просто хочу создать что-то вроде
{
"key1": value1,
"key2": value2
}
от
[{ "key1": value1 }, { "key2": value2 }]
1 ответ
Данный список содержит только объекты JSON (таким образом, элементы, которые имеют пары ключ-значение или элементы с Object
конструктор), вы можете написать свой собственный:
import Data.Aeson(Value(Object))
import qualified Data.HashMap.Lazy as HML
merge_aeson :: [Value] -> Value
merge_aeson = Object . HML.unions . map (\(Object x) -> x)
Если мы протестируем вышеуказанную функцию с заданным вводом образца, мы получим:
Prelude Data.Aeson HML> merge_aeson [object ["key1" .= "value1"], object ["key2" .= "value2"]]
Object (fromList [("key2",String "value2"),("key1",String "value1")])