Проверьте тип входящей структуры JSON с помощью AESON

Я использую Yesod для создания одной конечной точки POST, которая может обрабатывать несколько форматов JSON. Их я назвал 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)

person cmdv    schedule 13.03.2019    source источник


Ответы (1)


Тип Aeson Object — это просто HashMap Text Value (docs), поэтому вы можете использовать withObject для получения объекта (при условии, что все объекты являются объектами), а затем выполнить любую логику, которую вы хотите преобразовать в соответствующий тип. Скорее всего, это будет включать проверку конкретных ключей, чтобы определить, какой это вариант, или, возможно, json объявит, что это такое, в поле type. Это, конечно, делается путем создания ручной версии parseJSON в экземпляре FromJSON, но, честно говоря, для всего, что не совсем просто, я все равно предпочитаю делать это.

person sbditto85    schedule 13.03.2019