Aeson:解析json对象以列出

时间:2018-11-26 09:50:18

标签: json haskell aeson

我想将json对象的值解析到一个列表中。

这是我目前的方法(简化后的新类型基于以下结果:Aeson: derive some (but not all) fields of a struct(意味着我需要它))

Json:

{"v1": 1, "v2": 2}

想要的结果:

Test [1,2]

当前方法:

import Data.Aeson
import Data.HashMap.Strict (elems)

newtype Test = Test [Int]
instance FromJSON Test where
  parseJSON (Object o) =
    mapM parseJSON (elems o)

编译错误:

• Couldn't match type ‘[b0]’ with ‘Test’
  Expected type: aeson-1.1.2.0:Data.Aeson.Types.Internal.Parser Test
    Actual type: aeson-1.1.2.0:Data.Aeson.Types.Internal.Parser [b0]
• In the expression: mapM parseJSON (elems o)

1 个答案:

答案 0 :(得分:2)

mapM parseJSON (elems o)返回Parser [Int],但是您需要Parser (Test [Int]),因此正确的方法是:

instance FromJSON Test where
    parseJSON (Object o) = Test <$> mapM parseJSON (elems o)

但是,parseJSON的自变量类型为Value,自变量的值可以不是Object,也可以是Array,{{1} }等,因此最好使用String来检查其含义:

withObject

instance FromJSON Test where parseJSON val = withObject "Test" (\o -> Test <$> mapM parseJSON (elems o)) val 将在类型withObject的值不是Value时显示有意义的错误消息。