这是嵌套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
比例将通过简单划分苹果和橙子数来找到。
答案 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。