json - 如何使用 aeson 将数组解析为元组?

标签 json haskell serialization aeson

如果我有一个数组["addTask", {"id": "1", "description": "d", "dependsOn": [], "dependentTasks": []}].

data Task = Task
    { id :: String
    , description :: String
    , dependsOn :: [String]
    , dependentTasks :: [String]
    } deriving (Eq, Show, Generic, ToJSON, FromJSON)
type Change = Storage -> Storage
addTask :: Task -> Change
addTask (Task id desc dep dept) = insert id (Task id desc dep dept)

如何创建一个解析器来生成 addTask?

instance FromJSON (Storage -> Storage) where
    parseJSON (Array v) = do
        name <- parseJSON $ v V.! 0 :: Just String
        task <- parseJSON $ v V.! 1 :: Just Task
        return (addTask task)

这是我当前的尝试,但不起作用。

最佳答案

我会继续将数组解析为元组 (String,Task)然后使用简单的模式匹配,如果您使用OverloadedStrings,您可能需要指定“addTask”的类型,可以通过ScopedTypeVariables来完成(只需将其添加到 .. :: (String, Task) <- parse.. 的左侧)。

instance FromJSON (Storage -> Storage) where
    parseJSON v = do ("addTask",t) <- parseJSON v
                     return $ addTask t

注意:我没有编译或测试此代码

编辑

使用替代方法非常简单,您只需定义两个解析器并将它们组合起来

instance FromJSON (Storage -> Storage) where
    parseJSON v = let addP = do ("addTask",t) <- parseJSON v
                                return $ addTask t
                      rmP = do ("rmTask",n) <- parseJSON v
                               return $ rmTask n
                   in addP <|> rmP

我假设rmTask :: Int -> Change否则你总是可以case在元组的第一个元素上。

关于json - 如何使用 aeson 将数组解析为元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42707231/

相关文章:

java - 使用匹配器和正则表达式后如何传递数组项的原始值

javascript - 对对象类型数组的属性求和并将它们连接为单个对象

Haskell "show is applied to too many type arguments"

Java - 方法的存在导致程序无法正常工作

wcf - 如何防止 WCF 将字节数组自动序列化为 base-64 编码字符串?

php - 序列化和反序列化时防止对象重写

javascript - 在 Json 中搜索并获得有限的搜索结果

json - Go 中的函数对数据库执行选择查询并返回 json 输出

haskell - 为什么 `minimum (1, 2)` 在 Haskell 中返回 2?

Haskell 相当于 Scala 的 groupBy