2016-10-17 9 views
-1

次のjsonがElasticsearchから返されました。 JavaでList<String>highlight.nameの値を取得する最も高速で効率的な方法は何ですか?特定のJson要素をJavaの配列に取得する方法

{ 
     "timed_out": false, 
     "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
     }, 
     "hits": { 
     "max_score": 6.512624, 
     "hits": [ 
      { 
      "_index": "shops", 
      "_type": "shop", 
      "_id": "AVfRy7_-rRRgqtjX0fQt", 
      "_score": 6.512624, 
      "highlight": { 
       "name": [ 
       " <em>Smartwatch</em> Phone" 
       ] 
      } 
      }, 
      { 
      "_index": "shops", 
      "_type": "shop", 
      "_id": "AVfRy7_9rRRgqtjX0fGz", 
      "_score": 6.446859, 
      "highlight": { 
       "name": [ 
       " <em>Smartwatch</em>" 
       ] 
      } 
      }, 
      { 
      "_index": "shops", 
      "_type": "shop", 
      "_id": "AVfRy7_-rRRgqtjX0fVa", 
      "_score": 3.7999475, 
      "highlight": { 
       "name": [ 
       " 3G <em>Smartphone</em>" 
       ] 
      } 
      } 
     ] 
     } 
    } 
+1

あなたはjsonをjavaオブジェクトに変換し、jsonにマップされたpojoを作成し、jsonをJavaオブジェクトに変換して、必要なフィールドを取得することができます。 –

答えて

1

そのために使用JSONObject:

// jsonResult is a string that contains your ES response 
    JSONArray json = (new JSONObject(jsonResult)).getJSONObject("hits").getJSONArray("hits"); 

    List<JSONArray> result = new ArrayList<>(); 
    json.forEach((j) -> { 
     JSONObject highlight = ((JSONObject) j).getJSONObject("highlight"); 
     result.add(highlight.getJSONArray("name")); 
    }); 

    // Outputs [[" <em>Smartwatch<\/em> Phone"], [" <em>Smartwatch<\/em>"], [" 3G <em>Smartphone<\/em>"]] 
    System.out.println(result); 
0

ジャクソンライブラリは、JSONの単純なフォーマットを提供します。

ObjectMapper om = new ObjectMapper(); 
om.enable(SerializationConfig.Feature.INDENT_OUTPUT); 
Object json = om.readValue(output, Object.class); 
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(json)); 
0

代替案をベンチマークして、どちらがより高速で効率的であるかを確認する必要があります。以下は、ジャクソン経由ではより高速かもしれませんが、正規表現を使用すると、より壊れやすくなります。あなたがjsonPathライブラリを使用することができます

List<String> matches = new ArrayList<>(); 
    Pattern p = Pattern.compile("\"highlight\".*?\"name\": \\[\\s*\"(.*?)\"\\s*\\]", Pattern.DOTALL); 
    Matcher m = p.matcher(json); 

    while (m.find()) { 
     matches.add(m.group(1)); 
    } 

    System.err.println(matches); 
+0

こんにちはDavid、私は正規表現を試しましたが、マッチを見つけられませんでした。そして、私は正規表現に慣れていないので、本当にそれを微調整することはできません。 – panipsilos

+0

あなたが提供したサンプルで私のために働いて、 '[Smartwatch電話番号、スマートウォッチ、3G スマートフォン]'を印刷します。おそらくサンプルコードを実行する前にjsonを再フォーマットしたでしょうか? –

0

は、それだけで1行のコードでJSONから値を読み込むための最速の方法です。

List<String> highlightResults = JsonPath.parse(/*yourJsonString*/).read("$..name", List.class); 
関連する問題