在 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])]
应该会更好。
我有一个 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])]
应该会更好。