在 Aeson 解析器中提取和合并对象值

Extract and merge objects values in Aeson parsers

我有一个 JSON 对象,它有很多我不知道的键,并列为我想连接到一个大列表的值。

示例JSON:

{ "a": [1,2,3], "f": [4,5,6], "b": [7,8,9]}

如何编写应用时 returns [1,2,3,4,5,6,7,8,9] 的 Aeson 解析器?

您应该能够将 JSON 解析为类似 Map String [Int] 的内容,并使用 elems function to get all of the values from the Map and concat 将它们组合成一个列表

Jeff 高兴地在上面提到 Map String [Int] 解码为这种格式,它确实如此!

Prelude> :m +Data.Aeson
Prelude Data.Aeson> :type encode
encode :: ToJSON a => a -> Data.ByteString.Lazy.Internal.ByteString
Prelude Data.Aeson> :m +Data.Map
Prelude Data.Aeson Data.Map> let bs = encode (fromList [("a", [1,2,3]), ("f", [4,5,6]), ("b", [7,8,9])])
Prelude Data.Aeson Data.Map> bs
"{\"a\":[1,2,3],\"b\":[7,8,9],\"f\":[4,5,6]}"
Prelude Data.Aeson Data.Map> decode bs :: Maybe (Map String [Int])
Just (fromList [("a",[1,2,3]),("b",[7,8,9]),("f",[4,5,6])])
Prelude Data.Aeson Data.Map> fmap elems (decode bs :: Maybe (Map String [Int]))
Just [[1,2,3],[7,8,9],[4,5,6]]
Prelude Data.Aeson Data.Map> fmap (mconcat . elems) (decode bs :: Maybe (Map String [Int]))
Just [1,2,3,7,8,9,4,5,6]

(请注意,地图元素未排序,因此不会保留输入顺序。关联列表 [(String, [Int])] 应该会更好。