Как отфильтровать значения массива с помощью Data.Lens.Aeson перед их анализом? - PullRequest
1 голос
/ 23 сентября 2019

У меня есть входящий 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{..}
...