java - 使用 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;
解决方案
如前所述,您实际上是在寻找 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 和规范也可以内联定义。我还没有测试过这个端到端。
推荐阅读
- etcd - etcd v3 中“Watch key changes”的最佳实践
- javascript - Javascipt嵌套而循环未结束
- azure - Azure B2C:删除令牌过期
- istio - 在 istio-proxy 和 egress gateway 之间使用自定义 mTLS 发起 egress 流量的 mTLS
- flutter - 如何在flutter中动态生成网格视图?
- traefik - 使用 `swarmMode = true` 运行 traefik 的优缺点是什么?
- c++ - 在 qt5 之前发送数据
- javascript - 使用 html() 方法时如何解决 jsPdf 中的 UTF-8 问题?
- android - 无法通过地理定位器在 Flutter 中检索位置
- python - 升级/更新 Anaconda