2016-10-12 18 views
1

これは、ネストされたES集計クエリの結果です。このレスポンスを解析し、新しいJSON形式に変換する必要があります。次のJSONから興味のある項目はkey_as_a_stringの値と各キーのリンゴとオレンジの値だけです。ネストされた集約クエリ応答の解析

"aggregations": { 
    "Inner_aggregation": { 
     "doc_count": 366, 
     "Hours_aggregation": { 
      "doc_count": 366, 
      "by_day": { 
       "buckets": [ 
        { 
         "key_as_string": "2016-01-11", 
         "key": 1452556800000, 
         "doc_count": 1, 
         "Apples": { 
          "value": 5 
         }, 
         "Oranges": { 
          "value": 3 
         } 
        }, 
        { 
         "key_as_string": "2016-01-12", 
         "key": 1452556800000, 
         "doc_count": 1, 
         "Apples": { 
          "value": 43 
         }, 
         "Oranges": { 
          "value": 2 
         } 
        }, 
        ........., 
        ......... 
       ] 
      } 
     } 
    } 
} 
} 

私は(それがジャクソンobjectmapperを使用するか、またはsr.getAggregationsを使用して解析することができます)。取得(「histogram_name」)方法と、その後のコレクションを反復処理。簡単な方法があるかどうかを知りたい

必要なJSON形式

{ 
    "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 
    }] 
} 

比率は、リンゴとオレンジ色の数を単純に分割して発見されます。

+0

いいえ、クラスタからの残りのインターフェイス応答があります。レスポンス形式を変更することはできません。休憩の全体のポイントです。データを変換するために、クラスタとクライアントの間にトランスレータが必要な場合があります。 – user3775217

答えて

1

Java表現が複雑なネストされた構造と大きく異なる場合、jsonを直接Javaクラスにマップすることは役に立ちません。この種のデータを動的に処理できます。

Java 8 &ライブラリDynamicsを使用して、このようなデータを処理する方法があります。

私たちは、これは私たちに、この入れ子構造に対処するためのヌル・安全な&流暢な方法を提供します

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

をマップ/リスト構造にJSONを解析し、

ダイナミックインスタンスとしてこれを包みます。この場合、私たちはバケツに興味を持っています。これらのバケツに簡単に乗るといいでしょう。

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を参照してください。

関連する問題