我有一个复杂的嵌套数据结构,我想根据一些提供的上下文以不同的方式转换为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
,然后编写代码来编辑(粗略)。
RedactedMyType
并复制原始类型的结构,但根据需要在ADT中的编辑选项中进行修改。非常粗略。有人有任何建议吗?