使用AESON检查传入的JSON结构的类型

问题描述 投票:2回答:1

我正在使用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)
haskell yesod aeson
1个回答
1
投票

Aeson Object类型只是一个HashMap Text Valuedocs)所以你可以使用withObject来获得一个对象(假设所有都是对象)然后做任何你想要将它转换为适当类型的逻辑。这很可能涉及检查特定键以识别它是哪个变体或者可能让json声明它在type字段中的含义。这当然是通过在parseJSON实例中制作FromJSON的手动版本,但老实说,对于任何不完全简单的事情我都喜欢这样做。

© www.soinside.com 2019 - 2024. All rights reserved.