2017-11-25 260 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阵列