在我的项目中,我需要使用google收集一些计算出来的统计数据。如果您愿意,可以使用提供的链接找到原始的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"]
}
}
}首先,我尝试用图形来解决这个问题。我在那里面对我的第一个问题。我使用谷歌库提供的pojo类来避免重复。我为图形指定了必需的对象描述,直到节点成为映射为止。结果,我无法描述应该为我的请求过滤哪些映射键。关于指明问题的问题由不同的人发布,但还没有回答。
因此,我的下一个尝试是使用任何json处理库来删除与我的配置无关的所有冗余节点。现在我试着用:
"$.id",
"$.kind",
"$.lighthouseResult.audits.metrics",
"$.lighthouseResult.audits.time-to-first-byte"但是解决方案应该是灵活的,并且可以在java之外配置(在任何属性文件中)。因此,重要的是要有一个机会,安全的所有匹配者在删除时间作出正确的决定。
至于我,有两种方法可以获得所需的信息:
我希望有更好的决策来达到这个目标,并且需要有用的建议,如果您有一个优雅的解决方案,可以作为代码示例。
发布于 2019-08-30 10:37:19
作为临时解决方案,我考虑使用:
<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),没有异常(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或没有配置paths,则必须跳过逻辑)。path list中移除它们的子级。JsonPath.parse(json)中删除所有内容。https://stackoverflow.com/questions/57719291
复制相似问题