当前位置: 首页 > 知识库问答 >
问题:

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

卢德惠
2023-03-14

在我的项目中,我需要使用谷歌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指定了必需的对象描述。结果,我无法描述应该为我的请求过滤哪些映射键。关于指定问题的问题由不同的人发布,但尚未回答。

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

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

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

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

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

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

共有1个答案

司徒斌
2023-03-14

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

<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);

路径列表不完全是路径列表。这种配置DocumentContext的方式提供了匹配路径列表(Option.AS_PATH_LIST)没有例外(选项。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中阅读代码看起来有点复杂(处理性能情况并使其以动态方式工作)。例如:

>

4.1筛选器如果在结果集合中有用于删除该集合的父级,则将该集合路由出去。

4.2配置的匹配器应用于从路径列表中删除其子级。

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

 类似资料:
  • 问题内容: 我已经在$ PATH变量中定义了6次相同的路径。 我没有注销来检查它是否有效。 如何删除重复项? $ PATH变量如下所示: 我如何将其重置为 问题答案: 您只需执行: 如果您想永久更改,则将其添加到当前会话中,将其添加到任何.bashrc,bash.bashrc,/ etc / profile- 适合您的系统和用户需求的位置。 注意:这是针对Linux的。对于新的编码器,我们将予以明

  • 问题内容: 不幸的是,新的Core Data语义使我发疯。我之前的问题有一个干净的代码,因为头文件的自动生成不正确,因此无法正常工作。现在,我继续删除对象的工作。我的代码似乎很简单: 我用代替进行了“硬”调试,它向我展示了正确的对象。所以我只需要删除它。 PS没有。现在NSManagedContext只有 问题答案: 在您的情况下,提取的结果是托管对象 的 数组,因此您可以枚举该数组并删除所有匹配

  • 所以我有这个方法: 根据这篇文章: save方法没有任何作用。即使我们删除了它,Hibernate仍然会发出UPDATE语句,因为只要当前正在运行的EntityManager处于打开状态,实体是受管理的,任何状态更改都会传播。 并且确实发出了update语句,但是如果我在没有< code>@Transactional注释的情况下运行该方法: HiberNate不会发出更新语句,因此必须显式调用。

  • 问题内容: 我有一个看起来像这样的json数组: 我想有一个函数来删除“孩子”为空的元素。我该怎么做?我不是要答案,只是建议 问题答案: 要遍历对象的键,请使用循环: 要测试空元素的所有元素,可以使用递归方法:遍历所有元素,然后也递归地测试它们的孩子。 可以使用关键字删除对象的属性: 说明文件: https://developer.mozilla.org/zh-CN/docs/JavaScript

  • 问题内容: 我有以下两个实体: 1-播放列表: *保存或更新播放列表实体时,需要使用 *CascadeType.ALL 来保存和更新PlaylistadMap集合。 orphanRemoval = true :在删除播放列表实体时需要,PlaylistadMap引用也应删除。 2- PlaylistadMap: 使用我删除播放列表时,出现以下异常: 请告知如何解决此异常。 问题答案: 将 Fetc

  • 问题内容: 我收到上述错误“ org.hibernate.ObjectDeletedException:被删除的对象将通过级联重新保存(从关联中删除已删除的对象):”。有人可以帮我这个问题是什么,应该怎么解决? 谢谢。 问题答案: 没有映射结束代码会有点困难…这通常是由于要删除与集合关联的对象引起的。 您必须从拥有的收藏夹中删除对象,然后再删除对象 但是您可以通过这种方式使用deleteOrpha