json - 如何使用 Haskell Aeson 解析数组

标签 json haskell aeson

我有一个 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/

相关文章:

java - 如何将多个 Map<String,String> 解包为 Json

json - JQ库: Overriding existing keys of an JSON object with another object keys

haskell - 关于应用程序的多个参数不起作用?

json - 将选项对象解析为选项列表

json - Aeson如何使用Data.Text.Lazy.IO解析JSON文件

python - Django:使用 Javascript 在我的模板中解析 JSON

web-services - 使用 WSRequest 发布 JSON 对象时出现问题

list - 如何使用随机选择对 Haskell 中的列表进行洗牌

haskell - 如何静态检查图形有效性?

json - 容错 JSON 解析