首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从JSON对象中检测和删除保存核心结构的冗余节点

从JSON对象中检测和删除保存核心结构的冗余节点
EN

Stack Overflow用户
提问于 2019-08-30 01:04:58
回答 1查看 604关注 0票数 1

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

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

代码语言:javascript
复制
    "id",
    "kind",
    "lighthouseResult.audits.metrics",
    "lighthouseResult.audits.time-to-first-byte"

代码语言:javascript
复制
{
  "id": "myId",
  "kind": "myKind",
  "lighthouseResult": {
    "audits": {
      "metrics": ["myMetrics"],
      "time-to-first-byte": ["myOtherMetrics"]
    }
  }
}

首先,我尝试用图形来解决这个问题。我在那里面对我的第一个问题。我使用谷歌库提供的pojo类来避免重复。我为图形指定了必需的对象描述,直到节点成为映射为止。结果,我无法描述应该为我的请求过滤哪些映射键。关于指明问题的问题由不同的人发布,但还没有回答。

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

代码语言:javascript
复制
    "$.id",
    "$.kind",
    "$.lighthouseResult.audits.metrics",
    "$.lighthouseResult.audits.time-to-first-byte"

但是解决方案应该是灵活的,并且可以在java之外配置(在任何属性文件中)。因此,重要的是要有一个机会,安全的所有匹配者在删除时间作出正确的决定。

至于我,有两种方法可以获得所需的信息:

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

我希望有更好的决策来达到这个目标,并且需要有用的建议,如果您有一个优雅的解决方案,可以作为代码示例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-30 10:37:19

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

代码语言:javascript
复制
<dependency>
  <groupId>com.jayway.jsonpath</groupId>
  <artifactId>json-path</artifactId>
</dependency>

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

代码语言:javascript
复制
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),没有异常(Option.SUPPRESS_EXCEPTIONS)。

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

代码语言:javascript
复制
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

匹配路径示例:

代码语言:javascript
复制
Collection<? extends String> read = pathList .read("$.*");
Collection<? extends String> read = pathList .read("$.*.*");
...
Collection<? extends String> read = pathList .read("$.*...*");

使用它们的子节点删除节点的示例:

代码语言:javascript
复制
JsonPath.parse(json).delete(path)

附注:

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

  1. 验证配置(如果没有指定nestingLevel或没有配置paths,则必须跳过逻辑)。
  2. 匹配结果列表应按后序排序。
  3. 应从配置的匹配器中清除结果集。
  4. 为了提高第一步的性能,我们可以按通常的顺序对结果进行排序。 4.1如果有用于移除集合的父集合(在结果集合中),则筛选出出集合的路径。 4.2配置的匹配器应用于从path list中移除它们的子级。
  5. 使用过滤路径从JsonPath.parse(json)中删除所有内容。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57719291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档