我有一个 JSON 文档,看起来像:
{ "series": [[1,2], [2,3], [3,4]] }
我想将其解析为一组数据类型:
data Series = Series [DataPoint]
data DataPoint = DataPoint Int Int -- x and y
我在尝试编写
FromJSON
时遇到了很多问题数据点的实例。instance FromJSON DataPoint where
parseJSON (Array a) = ???
我尝试使用 Lens 来破坏 DataPoint 记录,但它无法编译:
case a ^.. values . _Integer of -}
[x,y] -> DataPoint <$> x <*> y
_ -> mzero
这个错误失败了(前两行我什至没有镜头技巧,只是试图创建一个
DataPoint <$> 1 <*> 2
):Couldn't match type ‘aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser
Integer’
with ‘Integer’
Expected type: (aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser
Integer
-> Const
(Data.Monoid.Endo
[aeson-0.7.0.6:Data.Aeson.Types.Internal.Parse
(aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser I
-> Value
-> Const
(Data.Monoid.Endo
[aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser
Value
Actual type: (Integer
-> Const
(Data.Monoid.Endo
[aeson-0.7.0.6:Data.Aeson.Types.Internal.Parse
Integer)
-> Value
-> Const
(Data.Monoid.Endo
[aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser
Value
In the second argument of ‘(.)’, namely ‘_Integer’
In the second argument of ‘(^..)’, namely ‘values . _Integer’
有一个更好的方法吗?
有人有将值数组解析为更详细结构的示例吗?
最佳答案
Aeson 有列表的实例,所以我认为没有必要处理向量。
{-# LANGUAGE LambdaCase #-}
import Data.Aeson
data Series = Series [DataPoint]
data DataPoint = DataPoint Int Int
instance FromJSON DataPoint where
parseJSON jsn = do
[x,y] <- parseJSON jsn
return $ DataPoint x y
instance FromJSON Series where
parseJSON = \case
Object o -> (o .: "series") >>= fmap Series . parseJSON
x -> fail $ "unexpected json: " ++ show x
关于json - 如何使用 Haskell Aeson 解析数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24742872/