解析嵌套聚合查询响应

时间:2016-10-12 10:10:16

标签: java json elasticsearch

这是嵌套ES聚合查询的结果。我需要解析此响应并将其转换为新的JSON格式。从以下JSON中,我感兴趣的唯一字段是值key_as_a_string以及每个键的苹果和橙子的值。

{
    "Results": [{
        "key_as_string": "2016-01-11",
        "Apple_to_Orange_Ratio": 0.112
    }, {
        "key_as_string": "2016-01-12",
        "Apple_to_Orange_Ratio": 0.12
    }]
}

我可以使用Jackson objectmapper或使用sr.getAggregations()。get(" histogram_name")方法解析它,然后迭代集合。想知道是否有一个简单的方法。

必需的JSON格式

Grunfile.js

比例将通过简单划分苹果和橙子数来找到。

1 个答案:

答案 0 :(得分:1)

当您的Java表示与复杂的嵌套结构完全不同时,将json直接映射到Java类可能没有用。你可以动态处理这类数据。

这是使用Java 8& S处理此类数据的方法。图书馆Dynamics

我们将json解析为map / list结构,并将其包装为动态实例

Map jsonMap = new ObjectMapper().readValue(exampleJson, Map.class);
Dynamic jsonData = Dynamic.from(jsonMap);

这给了我们一个零安全的&流畅的方式来处理这种嵌套结构。在这种情况下,我们对桶很感兴趣,很容易就可以轻松搞定。

List<MyResult> results = jsonData
    .dget("aggregations.Inner_aggregation.Hours_aggregation.by_day.buckets")
    .children()
    .map(bucket -> new MyResult(bucket))
    .collect(toList());

现在我们的类MyResult可以处理桶数据,这也是一个动态实例。

public class MyResult {
    private final Dynamic bucket;

    public Result(Dynamic bucket) {
        this.bucket = bucket;
    }

    public String getKey() {
        return bucket.get("key_as_string").asString();
    }

    public double getAppleToOrangeRatio() {
        double apples = bucket.dget("Apples.value").convert().intoDouble();
        double oranges = bucket.dget("Oranges.value").convert().intoDouble();
        return oranges / apples;
    }
}

我们可以访问比率。

double appleToOrangeRatio = results.get(0).getAppleToOrangeRatio();
// 0.6

有关来源,文档和示例,请参阅https://github.com/alexheretic/dynamics