首页 > 解决方案 > 使用 Jaca JsonPath 从 JSON 响应中排除项目

问题描述

我正在使用 JsonSmartJsonProvider,我的 JSON 看起来像这样

  {
  "info": {
    "clientCount": 1,
    "compactorVersion": 2,
    "processMonitor": {
      "processList": [
        {
          "name": "java.exe",
          "commandLine": "",
          "pid": 6224
        }
      ]
    }
  }
}

我试图排除“processList”,但保留其他所有内容。我已经尝试过 的变体$.info[?(@ noneof ['processMonitor'])],但我总是以“信息”在响应中为空而告终。是否可以使用 JsonPath 来执行此操作?用于执行此操作的代码如下所示:

        DocumentContext document = JsonPath.using(CONFIGURATION).parse(json);
        
        Map<String, Object> result = new HashMap<>();
        paths.forEach((key, value) -> result.put(key, document.read(value)));
        return result;

标签: javajsonpath

解决方案


如前所述,您实际上是在寻找 JSON 转换。JOLT 是一个可以做到这一点的通用库。解决方案可能如下所示:

import java.util.List;
import com.bazaarvoice.jolt.Chainr;
import com.bazaarvoice.jolt.JsonUtils;
 
public class MyJsonTransformer {
    public static void main(String[] args) throws Exception {
        List<Object> specs = JsonUtils.classpathToList("/spec.json");
        Chainr chainr = Chainr.fromSpec(specs);
 
        Object inputJSON = JsonUtils.classpathToObject("/input.json");
        Object transformedOutput = chainr.transform(inputJSON);
        System.out.println(JsonUtils.toPrettyJsonString(transformedOutput));
    }
}

还有一个像这样的震动去除器规范文件:

[
  {
    "operation": "remove",
    "spec": {
      "info": {
        "processMonitor": {
          "processList": ""
          }
        }
      }
    }
]

您可以在此处使用您的输入和上面的规范在线尝试 JOLT 。挺整洁的。
JSON 和规范也可以内联定义。我还没有测试过这个端到端。


推荐阅读