Haskell 网络编程系列教程函数式语言Haskell

JSON API查询语言

2018-11-07  本文已影响55人  Lupino

在使用 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})

参考:Helper.hs#L155

上一篇下一篇

猜你喜欢

热点阅读