Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何使用两种不同类型的Aeson解析JSON字符串_Haskell_Aeson - Fatal编程技术网

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