У меня есть входящий JSON, который выглядит следующим образом:
{
"somekey": [
{ "objectType": "typeA"
, "key1": "val1"
, "key2": "val2"
}
, { "objectType": "typeB"
, "key3": "val3"
, "key4": "val4"
}
]
При разборе я хочу иметь дело ТОЛЬКО с объектами, помеченными typeA
.У меня есть следующий код для работы, но я смотрю на что-то более идиоматическое, которое будет правильно использовать силу линз И приведет к лучшему сообщению об ошибке, если синтаксический анализ завершится неудачно:
import Control.Lens
import Data.Aeson.Lens (values, key, _String)
instance FromJSON MyType where
parseJson = Aeson.withObject "Expecting JSON object" $ \o -> do
allItems <- o .: "someKey"
let selectedItems :: [Aeson.Value] = filter (\x -> x ^? (key "objectType") . _String == Just "typeA") $ allItems ^.. values
someKey <- mapM parseJON selectedItems
pure MyType{..}