0
,我有以下的JSON数据导线/重写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!\" \
\ } \
\ }"
,我的目标是改写这个对象,它只包含了“直接路径”,以给定的键 - 例如如果我搜索“ERRORMSG”只应
Just "{\"cleanup\":\"It is dead Jim!\"}"
或
Just "{\"cleanup\": {\"errormsg\":\"It is dead Jim!\"}}"
,并在关键的是不存在的情况下Nothing
,我对棱镜和遍历知识仍处于阶段发展,使我能够做到的唯一事情是:
#!/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")
]
这将产生
{"export":null,"cleanup":"It is dead Jim!","import":null}
{"export":null,"cleanup":null,"import":null}
您可能会发现通过调整问题可以更轻松一些。不要返回已经过滤的整个JSON blob,而是尝试返回两个部分:'data Result = Result {path :: [String],piece :: Value}'。然后你可以直接重建一个完整的JSON值。 –