[英]Parse Incoming JSON directly into DTO with dynamic key
我正在尝试将Elastic搜索返回的数据解析为java类。 弹性搜索将以下面给出的形式返回数据:
"aggregations": {
"aggregationName": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 439,
"doc_count": 7,
"nestedAggregationName": {
"value": 5
}
}
]
}
}
这里的“ aggregationName”和“ nestedAggregationName”是动态的,意味着它们可以是任何东西,那么我该如何管理我的课程呢? 我想直接解析返回到DTO的数据。
编辑:我能够通过使类如下以一种通用的方式来解析“ aggregationName”:
public Class Aggregation{
private Map<String, AggregationModel> aggregation;
//with getters and setters.
}
因此,无论“ aggregationName”是什么,它都易于解析,并且AggregationModel包含与“ aggregationName”相对应的字段。 如何为“ nestedAggregationName”解决此问题?
请帮忙。
一段时间以前,我摸索了同样的问题,不幸的是Java客户端不支持聚合响应(如果我错了,请纠正我)。 以下是我经过多轮跟踪错误方法得出的结论,请告诉我是否有帮助。
private Map<String, List<Map.Entry<String, Long>>> buildAggregationsFromResult(SearchResults resultSet, Set aggregationsName) {
Map<String, List<Map.Entry<String, Long>>> aggregations = new LinkedHashMap<String, List<Map.Entry<String, Long>>>();
if (null != resultSet.getAggregations()) {
Map<String, Aggregation> aggregationMap = resultSet.getAggregations().asMap();
for (Map.Entry<String, Aggregation> aggregationEntry : aggregationMap.entrySet()) {
fetchBucketTermsFromAggregations(aggregationEntry,aggregations, aggregationsName);
}
}
return aggregations;
}
private List<Map.Entry<String, Long>> fetchBucketTermsFromAggregations(Map.Entry<String, Aggregation> aggregationEntry, Map<String, List<Map.Entry<String, Long>>> aggregations, Set<String> aggregationsName) {
Terms terms = null;
List<Map.Entry<String, Long>> pairs = new ArrayList<>();
if (aggregationEntry.getValue() instanceof InternalNested) {
for (Map.Entry<String, Aggregation> aggregationEntryNested : ((InternalNested) aggregationEntry.getValue()).getAggregations().asMap().entrySet()) {
pairs = fetchBucketTermsFromAggregations(aggregationEntryNested, aggregations, aggregationsName);
if (CollectionUtils.isNotEmpty(pairs) && aggregationsName.contains(aggregationEntry.getKey()))
aggregations.put(aggregationEntry.getKey(), pairs);
}
} else if (aggregationEntry.getValue() instanceof InternalFilters) {
for (InternalFilters.Bucket buckets : ((InternalFilters) aggregationEntry.getValue()).getBuckets()) {
for (Map.Entry<String, Aggregation> nestedAggregations : buckets.getAggregations().asMap().entrySet()) {
pairs = fetchBucketTermsFromAggregations(nestedAggregations, aggregations, aggregationsName);
if (CollectionUtils.isNotEmpty(pairs) && aggregationsName.contains(aggregationEntry.getKey()) )
aggregations.put(aggregationEntry.getKey(), pairs);
}
}
} else {
terms = (Terms) aggregationEntry.getValue();
if (null != terms ) {
Collection<Terms.Bucket> buckets = terms.getBuckets();
for (Terms.Bucket bucket : buckets) {
if (CollectionUtils.isNotEmpty(bucket.getAggregations().asList()))
pairs.add(new AbstractMap.SimpleEntry<String, Long>(bucket.getKeyAsString(), ((InternalReverseNested)bucket.getAggregations().asList().get(0)).getDocCount()));
else
pairs.add(new AbstractMap.SimpleEntry<String, Long>(bucket.getKeyAsString(), bucket.getDocCount()));
}
}
if (CollectionUtils.isNotEmpty(pairs) && aggregationsName.contains(aggregationEntry.getKey()))
aggregations.put(aggregationEntry.getKey(), pairs);
}
return pairs;
}
我知道这看起来有些笨拙,但可以为您服务。 否则让我知道。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.