Aeson:解析 json 对象以列出
Aeson: Parse json object to list
我想将 json 对象的值解析为列表。
这是我目前的方法(经过简化,新类型基于以下结果:(意味着我需要它)):
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)
mapM parseJSON (elems o)
returnsParser [Int]
,但是你需要Parser (Test [Int])
,所以正确的做法是:
instance FromJSON Test where
parseJSON (Object o) = Test <$> mapM parseJSON (elems o)
但是parseJSON
的参数类型是Value
,参数的值可以不是Object
,也可以是Array
,String
等等,所以最好使用 withObject
来检查它是什么:
instance FromJSON Test where
parseJSON val = withObject "Test"
(\o -> Test <$> mapM parseJSON (elems o))
val
当类型 Value
的值不是 Object
. 时,withObject
将打印一条有意义的错误消息
我想将 json 对象的值解析为列表。
这是我目前的方法(经过简化,新类型基于以下结果:
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)
mapM parseJSON (elems o)
returnsParser [Int]
,但是你需要Parser (Test [Int])
,所以正确的做法是:
instance FromJSON Test where
parseJSON (Object o) = Test <$> mapM parseJSON (elems o)
但是parseJSON
的参数类型是Value
,参数的值可以不是Object
,也可以是Array
,String
等等,所以最好使用 withObject
来检查它是什么:
instance FromJSON Test where
parseJSON val = withObject "Test"
(\o -> Test <$> mapM parseJSON (elems o))
val
当类型 Value
的值不是 Object
. 时,withObject
将打印一条有意义的错误消息