4

我有一个像这样的 aeson 对象列表

[object ["key1" .= "value1"], object ["key2" .= "value2"]] 

我想将它们合并为像这样的单个 aeson 对象

object ["key1" .= "value1", "key2" .= "value2"]

在使用其他语言的 JSON 数据(合并操作)时,这是非常标准的,但我在 Aeson 库中看不到任何类似的东西。

我只是错过了一些东西吗?可以用一些标准的haskell函数来完成吗?我尝试使用sequence,但似乎 JSONValue不是 monad,所以我不能这样做。

我不需要处理深度合并或重复键,我只想生成类似的东西

{
  "key1": value1,
  "key2": value2
}

[{ "key1": value1 }, { "key2": value2 }]
4

1 回答 1

8

鉴于列表包含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")])
于 2017-06-07T09:54:50.083 回答