我正在使用Yesod创建一个可以处理多种格式的JSON的POST端点。这些我称之为MessageType
(参见下面的代码)。
我试图弄清楚我如何能够与JSON的结构匹配,以便找出MessageType
是什么,对于这个例子,我需要检查它是否是一个ProjectCreation
。
希望能够JSON (projectCreation structure) -> MessageType -> do X
有没有办法简单地case
匹配JSON来解决它的类型?
data MessageType =
ProjectCreation { id :: ProjectId
, permId :: Maybe UUID
, queueId :: UUID
, transactionTimeKey :: Maybe Text
, name :: Text
, description :: Maybe Text
, createdOn :: Maybe UTCTime
, createdBy :: Maybe AgentId
, enabled :: Bool
, size :: Fixed E2
}
| DebtPaymentHistorical {..}
| PowerForecast {..}
...
deriving (Show, Read, Eq)
derivePersistField "MessageType"
$(deriveJSON defaultOptions ''MessageType)
Aeson Object
类型只是一个HashMap Text Value
(docs)所以你可以使用withObject
来获得一个对象(假设所有都是对象)然后做任何你想要将它转换为适当类型的逻辑。这很可能涉及检查特定键以识别它是哪个变体或者可能让json声明它在type
字段中的含义。这当然是通过在parseJSON
实例中制作FromJSON
的手动版本,但老实说,对于任何不完全简单的事情我都喜欢这样做。