在使用 JSON api 的时候,经常会遇见一些蛋疼的事情,我只要获取一些数据就可以,但 API 确给我所有的数据。于是我把 graphql
给集成进去,我可以获得我想要的字段,但我还是没办法进行预处理。
在某一天我看到了 Functional sed for JSON, 它可以让我写一些函数来处理 json 的数据,而这些函数都是安全的。于是我豁然开朗,如果把它集成到 JSON api 上面就可以解决我的痛点。
import Data.Aeson (Value)
import Web.Scotty (ActionM, rescue, param)
checkSed :: Value -> ActionM Value
checkSed j = do
inp <- param "jl" `rescue` (""::String)
if null inp then return j
else
case parseText "" (pack inp) of
Left err -> do
liftIO $ print err
return j
Right expr0 -> do
let expr = ApplicationExpression expr0 (valueToExpression j)
let core = eval (foldl (\e (v, f) -> subst v f e) (desugar expr) (M.toList scope))
return $ coreToValue core
然后在每个 json
输出数据的时候加上 checkSed
就可以 jl
进行处理数据。
modify "content" (\o->{blocks: map (modify "entityRanges" (filter (\r-> o.entityMap[showInt r.key].type /= "ASR-const"))) o.blocks, entityMap: filterWithKey (\k v -> v.type /= "ASR-const") o.entityMap})
网友评论