2017-11-25 262 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 

,所以我認爲這個問題是所有這些來自查詢,如果我得到一個乾淨的JSON這樣{"id":"2","name";"dinu"}它的工作原理其他的東西(我沒有手動測試),但它與許多其他的東西,例如作爲JSON文件(標題元數據)的頂部(檢查上面的JSON結果圖像)。

所以我覺得我有2個選擇: -

選項1: - 得到elasticsearch DB乾淨的結果,所以我需要修改的搜索查詢。我不知道彈性搜索是否可以實現。如果是的話,有人可以提出如何修改查詢的建議(在Java API中)。

選項2: - 篩選出JSON文件並刪除所有不需要的東西,然後將其變爲Contact對象。我試圖GSON和傑克遜都與未經過濾的文件失敗。如果有任何先進或自定義的方式來過濾讓我知道。

選項3: - 我完全錯了,有一個更好的簡單的方法來做它。請讓我知道。

UPDATE 看這個: - https://www.youtube.com/watch?v=YgKcVBbvy2U

,所以我試圖用GSON將序列

則異常不來,但系列化的「意外‘d’」後,我得到響應上述方式也在原始的甲酸鹽中,它每次輸出這個[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); 
} 

如果您需要再次s erialize它作爲一個JSON列表,你可以簡單地得到作爲JSON

String lstString = mapper.writeValueAsString(lst); 

上面提到的ObjectMapper距離Jackson數據綁定庫。這是非常好的,比Gson

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

從響應JSON中,hits:標籤應該是包含屬性index,type,id,score,source..etc的列表。請嘗試檢索包含具有聯繫人的對象的匹配列表對象

+0

我想要做的是刪除命中列表對象,只獲取JSON格式的聯繫人數據。 – Dinushka

0

不確定這是否有助於獲得您要查找的內容。我只是將你的字符串添加到文本文件中

Object obj = new JSONParser()。parse(new 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陣列