Haskell 如何使用两种不同类型的Aeson解析JSON字符串
我目前正努力使用Haskell 如何使用两种不同类型的Aeson解析JSON字符串,haskell,aeson,Haskell,Aeson,我目前正努力使用aeson库解析一些JSON数据。当缺少该属性的数据时,有许多属性的值为false。因此,如果属性的值通常是一个整数数组,并且恰好没有该属性的数据,则该值不是提供空数组或null,而是false。(这些数据的结构方式不是我自己的,因此我必须以某种方式处理它。) 理想情况下,我希望在值为布尔值的情况下得到一个空列表。我在下面创建了一个小测试用例进行演示。因为我的组数据构造函数需要一个列表,所以当遇到false时,它无法解析 数据组=组[Int]派生(等式,显示) jsonData1
aeson
库解析一些JSON数据。当缺少该属性的数据时,有许多属性的值为false
。因此,如果属性的值通常是一个整数数组,并且恰好没有该属性的数据,则该值不是提供空数组或null
,而是false
。(这些数据的结构方式不是我自己的,因此我必须以某种方式处理它。)
理想情况下,我希望在值为布尔值的情况下得到一个空列表。我在下面创建了一个小测试用例进行演示。因为我的组
数据构造函数需要一个列表,所以当遇到false
时,它无法解析
数据组=组[Int]派生(等式,显示)
jsonData1::ByteString
jsonData1=[r|
{
“集团”:[1,2,4]
}
|]
jsonData2::ByteString
jsonData2=[r|
{
“组”:错误
}
|]
来自JSON组的实例,其中
parseJSON=withObject“group”$\g->do
items解决此问题的一种方法是在对您的数据集有效且对所有其他数据集无效的JSON数据构造函数上进行模式匹配
例如,您可以为该特定字段编写类似的内容,请记住parseJSON
是Value->Parser a
中的函数:
instance FromJSON Group where
parseJSON (Bool False) = Group <$> pure []
parseJSON (Array arr) = pure (Group $ parseListOfInt arr)
parseJSON invalid = typeMismatch "Group" invalid
parseListOfInt :: Vector Value -> [Int]
parseListOfInt = undefined -- build this function
在使用Aeson时,需要始终牢记的一点是(其中只有6个)和底层数据结构(HashMap
用于Object
和Vector
用于数组
)
例如,在上面,当您在数组arr
上进行模式匹配时,您必须意识到在arr
中得到了一个向量值,我们仍然需要做一些工作来将其转换为整数列表,这就是为什么我在上面没有定义另一个函数parseListOfInt
,因为我认为构建它可能是一个很好的练习
data GroupObj = GroupObj { group :: Group } deriving (Eq, Show)
instance FromJSON GroupObj