使用Aeson在Haskell中生成JSON

时间:2018-05-18 22:36:59

标签: haskell aeson

我有一个复杂的嵌套数据结构,我想根据一些提供的上下文以不同的方式转换为JSON。我的用例是我的服务器包含世界状态的完整状态,但根据要求它的客户端,我想提供一个编辑副本。理想情况下,我想写一些类似的东西:

instance ToJSON MyNestedType where
  toJSON x = do
    currentUser <- ask

    return $ if owner x == currentUser then (defaultToJson x) else (toJSON "REDACTED")

encodeWithReader (UserId 123) myDataStructure

查看toJSON :: a -> Value的类型对于普通的Aeson而言,这似乎是不可能的。这样做有什么好办法?我想到的几个选项:

  • 实现我自己的类型类ToJSONReader,并使用一个默认实现,只需传递给ToJSON并覆盖需要编辑的类型。像(这不是编译,只是伪代码。我实际上不知道如何使这项工作。):

    class ToJSONReader a where
      toJSONReader :: a -> Reader b Value
    
    instance ToJSON a => ToJSONReader a where
      toJSONReader x = return $ toJSON x
    
    instance ToJSONReader MyNestedType where
      toJSONReader x = do
        currentUser <- ask
        return $ if owner x == currentUser then (toJSON x) else (toJSON "REDACTED")
    
  • 不是直接使用encode,而是使用toJSON获取中间Value,然后编写代码来编辑(粗略)。

  • 扩展我的类型以包含用于编辑的标记,然后在转换为JSON之前预处理该类型的副本。
  • 创建一个新的复杂父类型RedactedMyType并复制原始类型的结构,但根据需要在ADT中的编辑选项中进行修改。非常粗略。

有人有任何建议吗?

0 个答案:

没有答案