Как объединить объекты 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")])
Другие вопросы по тегам