1

我有一个项目需要解析 JSON。我得到一个对象列表,但它都包含在“数据”键中。目前我有一个小目标可以帮助我:

data StorageList = StorageList { sl :: [Storage] }

instance FromJSON StorageList where
  parseJSON = withObject "StorageList" $ \v -> StorageList
    <$> v .: "data"

然后我只使用“sl”从结果中获取我的实际列表。

它工作得很好,但我想我们都会同意它很丑。我想必须有一种更简单的方法来直接解析 [Storage],以某种方式告诉 parseJSON 只是从内部数据开始。哦,我正在使用来自 http-conduit 的 httpJSONEither,但如果没有办法做到这一点,我想我可以改变它。

编辑:这是存储:

data Storage = Storage { storageId     :: Text
                       , storageName   :: Text
                       , storageNode   :: Text
                       , storageSize   :: Int
                       , storageUsed   :: Int
                       } deriving Show

instance FromJSON Storage where
  parseJSON = withObject "Storage" $ \v -> Storage
    <$> v .: "id"
    <*> v .: "storage"
    <*> v .: "node"
    <*> v .: "maxdisk"
    <*> v .: "disk"

编辑 2: 我要解析的内容是这样的:

{
  "data":
  [
    {
      "id": "X",
      "storage": "X",
      ...
    },
    {
      "id": "Y",
      "storage": "Y",
      ...
    },
    ...
  ]
}

希望这会更清楚。我正在使用那个丑陋的“StorageList”对象来摆脱包装所有内容的数据键,它可以工作,但我确信必须有更好的方法来处理它。

4

0 回答 0