2017-11-25 15 views
1

私はelasticsearchデータベースを持っています。これは私が連絡先を格納するために使用したものです。私は以下の質問をします。Elasticsearch Java APIクエリJSONパーサー

public String getAllContacts() throws IOException { 

    SearchResponse response = client.prepareSearch("contact").get(); 

    return response.toString(); 
} 

私はこの Json result from query

のような結果が得られますので、その後、私は私の連絡先のクラスにしてJSONデータを配置するには、

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
import javax.xml.bind.annotation.XmlRootElement; 
import java.util.Date; 
@JsonIgnoreProperties(ignoreUnknown = true) 
@XmlRootElement 
public class Contact { 

    private long id; 
    private String name; 
    private Date date; 

    public Contact() {} 
    public Contact(long id, String name, Date date) { 
     this.id = id; 
     this.name = name; 
     this.date = date; 
    } 
    public long getId() {return id;} 
    public void setId(long id) {this.id = id;} 
    public String getName() { return name;} 
    public void setName(String name) {this.name = name;} 
    public Date getDate() { return date; } 
    public void setDate(Date date) { this.date = date; } 
} 

後、私が、私はマップしようとオブジェクト以下のコードを使用してオブジェクトにJSONエラーが発生する

ObjectMapper mapper = new ObjectMapper(); 
    List<Contact> myObjects = mapper 
.readValue(response.toString(), mapper 
.getTypeFactory() 
.constructCollectionType(List.class, Contact.class)); 

Can not deserialize instance of java.util.ArrayList out of START_OBJECT token 

ので、私が思う問題は、私はこの{"id":"2","name";"dinu"}のようにきれいなJSONを取得する場合、それは(私はそれを手動でテストしました)動作しますが、それは、そのような他の多くのものが付属していたクエリから来ている他のすべてのものの多くのエラーがありますJSONファイルの先頭部分(ヘッダーメタデータ)(上記のJSON結果イメージを確認してください)。

ので、私は2つのオプションを持っていると思う: -

オプション1: - がelasticsearch DBからクリーンな結果を得るので、私は、検索クエリを変更する必要があります。私はそれがelasticsearchでも可能かどうかはわかりません。もしそうなら誰かが(Java APIの)クエリを変更する方法の提案をすることができます。

オプション2: - JSONファイルをフィルタリングして不要なものをすべて削除し、それを連絡先オブジェクトにします。私はGSONとジャックソンの両方をフィルタリングされていないファイルで失敗しました。フィルタリングするための事前またはカスタム方法がある場合は、私に知らせてください。 3

オプション: - は、私は完全に間違っていると私に知らせてit.Please行うには良い簡単な方法があります。

UPDATE ウォッチTHIS: - ので、私は

をシリアライズするGSONを使用して上記の方法を試してみましたhttps://www.youtube.com/watch?v=YgKcVBbvy2U

は、例外が来ていないが、私は「予期しない 『D』」として連載した後、応答を取得しますまた、生のformateでこれを出力する[email protected]私はGETを送信するたびに@記号の変更後のテキストに応答する '。

答えて

3

を反復することにより、対応するオブジェクトに値を設定することができる方法を記述することができ検索ヒットの反復処理と値の逆シリアル化を行う必要があります。

SearchResponse response = client.prepareSearch("contact").get(); 
ObjectMapper mapper = new ObjectMapper(); 
List<Contact> lst = new ArrayList<Contact>(); 
for(SearchHit hit : response.getHits().getHits()) { 
    Contact c = mapper.readValue(hit.getSourceAsString(), Contact.class); 
    lst.add(c); 
} 

もう一度JSON

String lstString = mapper.writeValueAsString(lst); 

以上がObjectMapperを述べたように、あなたが簡単に取得することができますJSONリストジャクソンのデータバインディングライブラリからであるとして、それをerialize。 Gsonよりもかなりいいです。

import com.fasterxml.jackson.databind.ObjectMapper; 
0

レスポンスJSONから、hits:タグはindex、type、id、score、sourceなどの属性を含むリストにする必要があります。連絡先のオブジェクトを含むヒットリストオブジェクトを検索してください。

+0

ヒットリストオブジェクトを削除し、連絡先データをJSON形式で取得するだけです。 – Dinushka

0

あなたが探しているものを得るのに役立つかどうかは不明です。テキストファイルに文字列を追加しました。

オブジェクトobj =新しいJSONParser()。parse(新しいFileReader( "data")。TXT "));

// typecasting obj to JSONObject 
    JSONObject jo = (JSONObject) obj; 

    // getting hits 
    Map hits = ((Map)jo.get("hits")); 
    JSONArray array = null; 
    // iterating hits Map 
    Iterator<Map.Entry> itr1 = hits.entrySet().iterator(); 
    while (itr1.hasNext()) { 
     Map.Entry pair = itr1.next(); 
     System.out.println(pair.getKey() + " : " + pair.getValue()); 
     if(pair.getKey().equals("hits")){ 
      array = (JSONArray) pair.getValue(); 

     } 
    } 

    System.out.println(array); 

[{" _index ":" コンタクト " "_タイプ": "ID"、 "_ ID":2、 "_スコア":1}、{ "_インデックス":" コンタクト」、 "_タイプ": "ID"、 "_ ID":4、 "_スコア":1}]

おそらくJSON配列

関連する問題