java - 检测并从 JSON 对象中删除冗余节点,保存核心结构

标签 java json

在我的项目中我需要使用google api收集一些计算统计数据。如果您愿意,您可以使用提供的链接找到原始 json 对象字段。

项目需要保留比实际少得多的数据。例如,我对下一个 json 节点感兴趣:

    "id",
    "kind",
    "lighthouseResult.audits.metrics",
    "lighthouseResult.audits.time-to-first-byte"

{
  "id": "myId",
  "kind": "myKind",
  "lighthouseResult": {
    "audits": {
      "metrics": ["myMetrics"],
      "time-to-first-byte": ["myOtherMetrics"]
    }
  }
}

首先,我尝试使用 graphql 解决问题。我面临着我的第一个问题。我使用谷歌库提供的 pojo 类来避免重复。我为 graphql 指定了所需的对象描述直到节点成为 map 。因此,我无法描述应根据我的请求过滤哪些 map 键。 Question regarding specified issue由不同人发布但尚未回复。

所以我的下一个尝试是使用任何 json 处理库来删除与我的配置无关的所有冗余节点。现在我正在尝试使用:

    "$.id",
    "$.kind",
    "$.lighthouseResult.audits.metrics",
    "$.lighthouseResult.audits.time-to-first-byte"

但是解决方案应该是灵活的并且可以在java之外进行配置(在任何属性文件中)。因此,有机会在移除时保护所有匹配者以做出正确的决定非常重要。

对于我来说,有两种方法可以获取所需的信息:

  1. 使用 json 解析器库来获取节点路径。但是哪个库提供了类似的 API 呢?
  2. 从一开始就构建 json 对象,通过指定路径添加选定的节点。

我希望有更好的决策来实现目标,并且需要有用的建议,如果您有一个优雅的解决方案,可能是代码示例。

最佳答案

作为临时解决方案,我考虑使用:

<dependency>
  <groupId>com.jayway.jsonpath</groupId>
  <artifactId>json-path</artifactId>
</dependency>

库提供获取每个节点的路径列表。

Configuration jsonConf = Configuration.builder().options(Option.AS_PATH_LIST, Option.SUPPRESS_EXCEPTIONS).build();
DocumentContext pathList = JsonPath.parse(json, jsonConf);

pathList 并不完全是路径列表。这种配置 DocumentContext 的方式提供匹配路径列表 (Option.AS_PATH_LIST),无异常(exception) (Option.SUPPRESS_EXCEPTIONS)。

为了收集所需的路径,我尝试遵循以下逻辑:

WHILE FROM 1 to N
    PARSING JSON WITH MATCHER DEPENDENT ON INDEX VALUE
    COLLECTING TO LIST
END

REMOVE FROM LIST MATCHERS SPECIFIED MATCHERS IN CONFIGURATION
REMOVE FROM JsonPath.parse(json) ALL NODES BY LEFT MATCHERS

匹配路径示例:

Collection<? extends String> read = pathList .read("$.*");
Collection<? extends String> read = pathList .read("$.*.*");
...
Collection<? extends String> read = pathList .read("$.*...*");

删除节点及其子节点示例:

JsonPath.parse(json).delete(path)

附注

我没有提供所有代码,因为想法必须是关注的中心。在 java 中阅读代码看起来有点复杂(处理性能案例并使其以动态方式工作)。例如:

  1. 验证配置(如果未指定 nestingLevel 或未配置 path,则必须跳过逻辑)。
  2. 匹配结果列表应按倒序排序。
  3. 结果集应从配置的匹配器中清除。
  4. 为了提高第一步的性能,我们可以按通常的顺序对结果进行排序。

    4.1 过滤器路径出集合,如果它们具有要删除的父级(在结果集合中)。

    4.2 配置的匹配器应该用于从路径列表中删除它们的子项。

  5. 使用过滤路径会删除 JsonPath.parse(json) 中的所有内容。

关于java - 检测并从 JSON 对象中删除冗余节点,保存核心结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57719291/

相关文章:

java - Spark Structured Streaming with RabbitMQ 源码

javascript - 将 JSON 数据转换为 JavaScript 二维数组

javascript - 将 Javascript 变量传递到 JSON 请求

java - @XmlElementWrapper 序列化无法使用 Jackson JaxB 注释工作

javascript - 如何从json文件中正确提取信息?

java - 为什么有些时候Java无法捕获错误?

java - Tomcat 5(s) 中的目录结构

java - log4j 附加程序优先级冲突?

java - StyleableProperty : how to change value programatically at runtime?

javascript - 无法使用 AngularJS 访问 JSON 对象