在我的项目中我需要使用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之外进行配置(在任何属性文件中)。因此,有机会在移除时保护所有匹配者以做出正确的决定非常重要。
对于我来说,有两种方法可以获取所需的信息:
- 使用 json 解析器库来获取节点路径。但是哪个库提供了类似的 API 呢?
- 从一开始就构建 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
中阅读代码看起来有点复杂(处理性能案例并使其以动态方式工作)。例如:
- 验证配置(如果未指定
nestingLevel
或未配置path
,则必须跳过逻辑)。 - 匹配结果列表应按倒序排序。
- 结果集应从配置的匹配器中清除。
为了提高第一步的性能,我们可以按通常的顺序对结果进行排序。
4.1 过滤器路径出集合,如果它们具有要删除的父级(在结果集合中)。
4.2 配置的匹配器应该用于从
路径列表
中删除它们的子项。使用过滤路径会删除
JsonPath.parse(json)
中的所有内容。
关于java - 检测并从 JSON 对象中删除冗余节点,保存核心结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57719291/