je les données JSON suivantesTraverse/Réécrire une valeur JSON
value :: Maybe Value
value = decode
"{ \"import\" : { \"starttime\": \"2017-02-20T18:45:456.45645\" \
\ , \"endtime\" : \"2017-02-20T18:45:456.45645\" \
\ } \
\ , \"export\" : { \"starttime\": \"2017-02-20T18:45:456.45645\" \
\ , \"endtime\" : \"2017-02-20T18:45:456.45645\" \
\ } \
\ , \"cleanup\" : { \"starttime\": \"2017-02-20T18:45:456.45645\" \
\ , \"endtime\" : \"2017-02-20T18:45:456.45645\" \
\ , \"errormsg\" : \"It is dead Jim!\" \
\ } \
\ }"
et mon objectif serait de réécrire cet objet tel qu'il ne contient que le « chemin direct » à une clé donnée - par exemple si je recherche « errormsg » dans le cas ne devrait être
Just "{\"cleanup\":\"It is dead Jim!\"}"
ou
Just "{\"cleanup\": {\"errormsg\":\"It is dead Jim!\"}}"
et Nothing
où la clé est pas présent, mes connaissances sur Prismes et Traversées est encore au stade de développement de sorte que la seule chose que je réussi à faire est:
#!/usr/bin/env stack
-- stack runhaskell --package=lens --package=aeson --package=lens-aeson-lens --package=bytestring
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Lens
import Data.Aeson
import Data.Foldable
import Data.Aeson.Lens
import Data.Maybe
import qualified Data.ByteString.Lazy.Char8 as B
value :: Maybe Value
value = decode
"{ \"import\" : { \"starttime\": \"2017-02-20T18:45:456.45645\" \
\ , \"endtime\" : \"2017-02-20T18:45:456.45645\" \
\ } \
\ , \"export\" : { \"starttime\": \"2017-02-20T18:45:456.45645\" \
\ , \"endtime\" : \"2017-02-20T18:45:456.45645\" \
\ } \
\ , \"cleanup\" : { \"starttime\": \"2017-02-20T18:45:456.45645\" \
\ , \"endtime\" : \"2017-02-20T18:45:456.45645\" \
\ , \"errormsg\" : \"It is dead Jim!\" \
\ } \
\ }"
main :: IO()
main = do
traverse_ (traverse (B.putStrLn . encode))
[ value & _Just . members %~ fromMaybe Null . preview (key "errormsg")
, value & _Just . members %~ fromMaybe Null . preview (key "not here")
]
qui donne
{"export":null,"cleanup":"It is dead Jim!","import":null}
{"export":null,"cleanup":null,"import":null}
Vous pourriez trouver cela un peu plus facile avec un ajustement au problème. Plutôt que de renvoyer un blob JSON entier qui a été filtré, essayez de renvoyer les deux morceaux: 'data Résultat = Résultat {chemin :: [Chaîne], pièce :: Valeur}'. Vous pouvez ensuite directement reconstruire une valeur JSON entière à partir de cela. –