Проверьте тип входящей структуры JSON с AESON - PullRequest
2 голосов
/ 13 марта 2019

Я использую 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)

1 Ответ

1 голос
/ 13 марта 2019

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

...