我想将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)
答案 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
时显示有意义的错误消息。