我有一个项目需要解析 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”对象来摆脱包装所有内容的数据键,它可以工作,但我确信必须有更好的方法来处理它。