如何解析 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