如何解析 Haskell 中的 Json 对象列表?
How to parse a list of Json objects in Haskell?
我有一个数据class:
data MyData = MyData { a :: Int, b :: String }
instance ToJSON MyData where
....
instance FromJSON MyData where
....
我可以解析来自 json 的单个对象:
get :: IO (Maybe MyData)
get = do
res <- getSingleItemHttp
return $ decode $ responseBody res
如何获取 MyData 列表?
get2 :: IO [MyData]
get2 = do
res <- getManyItemsHttp
--????
return $ decode $ responseBody res -- doesn't compile
我该如何将 responseBody 解析为 List
?
一旦你传入一个数组(并解码为一个列表),它应该可以正常工作,所以你可能只需要将你的签名更改为 get2 :: IO (Maybe [MyData])
:
{-# LANGUAGE DeriveGeneric, OverloadedStrings #-}
module Json where
import GHC.Generics
import Data.Aeson
import Data.Text
import Data.ByteString.Lazy
data MyData = MyData { a :: Int, b :: String }
deriving (Generic, Show)
instance FromJSON MyData
example :: ByteString
example = "[{ \"a\": 1, \"b\": \"Hello\" }, { \"a\": 2, \"b\": \"World\" }]"
例子
λ> decode example :: Maybe [MyData]
Just [MyData {a = 1, b = "Hello"},MyData {a = 2, b = "World"}]
你的问题
会是这样的:如果你尝试
get :: [MyData]
get = decode example
编译器会抱怨
Couldn't match expected type [MyData]
with actual type Maybe a0
…
这应该会给你一个很大的提示。
您仍然可以通过 Data.Maybe.maybeToList
获得您的签名:
get :: [MyData]
get = Prelude.concat . maybeToList $ decode example
我有一个数据class:
data MyData = MyData { a :: Int, b :: String }
instance ToJSON MyData where
....
instance FromJSON MyData where
....
我可以解析来自 json 的单个对象:
get :: IO (Maybe MyData)
get = do
res <- getSingleItemHttp
return $ decode $ responseBody res
如何获取 MyData 列表?
get2 :: IO [MyData]
get2 = do
res <- getManyItemsHttp
--????
return $ decode $ responseBody res -- doesn't compile
我该如何将 responseBody 解析为 List
?
一旦你传入一个数组(并解码为一个列表),它应该可以正常工作,所以你可能只需要将你的签名更改为 get2 :: IO (Maybe [MyData])
:
{-# LANGUAGE DeriveGeneric, OverloadedStrings #-}
module Json where
import GHC.Generics
import Data.Aeson
import Data.Text
import Data.ByteString.Lazy
data MyData = MyData { a :: Int, b :: String }
deriving (Generic, Show)
instance FromJSON MyData
example :: ByteString
example = "[{ \"a\": 1, \"b\": \"Hello\" }, { \"a\": 2, \"b\": \"World\" }]"
例子
λ> decode example :: Maybe [MyData]
Just [MyData {a = 1, b = "Hello"},MyData {a = 2, b = "World"}]
你的问题
会是这样的:如果你尝试
get :: [MyData]
get = decode example
编译器会抱怨
Couldn't match expected type
[MyData]
with actual typeMaybe a0
…
这应该会给你一个很大的提示。
您仍然可以通过 Data.Maybe.maybeToList
获得您的签名:
get :: [MyData]
get = Prelude.concat . maybeToList $ decode example