Elasticsearch Java api查询JSON解析器

时间:2017-11-25 14:53:05

标签: java json elasticsearch

所以我有一个弹性搜索数据库,我用来存储联系人。我做以下查询。

 public String getAllContacts() throws IOException {

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

    return response.toString();
}

所以我得到这样的结果 Json result from query

然后我想将Json数据放入我的Contact类对象

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结果图像)。

所以我认为我有两个选择: -

选项1 : - 从elasticsearch DB获得一个干净的结果,所以我需要修改搜索查询。我不知道弹性搜索是否可行。如果是这样,有人可以就如何修改查询提出建议(在java API中)。

选项2 : - 过滤掉JSON文件并删除所有不需要的东西,然后将其转换为Contact对象。我试过GSON和杰克逊都未使用未经过滤的文件。如果有任何提前或自定义方式过滤掉,请告诉我。

选项3 : - 我完全错了,有一种更简单的方法可以做到。请让我知道。

更新 请注意: - https://www.youtube.com/watch?v=YgKcVBbvy2U

所以我尝试使用GSON序列化

的上述方法

然后异常没有到来但是我在序列化之后得到了响应&#34;意外的&#39;&#34;&#34;&#34;同样在原始格式中,每当我发送一个GET在@符号更改后回复文本时,它就会输出dinu.model.HitsObject@6c79684b

1 个答案:

答案 0 :(得分:0)

不确定这是否有助于获得您想要的东西。我刚把你的字符串添加到文本文件

Object obj = new JSONParser()。parse(new FileReader(&#34; data.txt&#34;));

    // 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);

[{&#34; _index&#34;:&#34;接触&#34;&#34; _type&#34;:&#34; ID&#34;&#34; _id&#34 ;: 2,&#34; _score&#34;:1},{&#34; _index&#34;:&#34;接触&#34;&#34; _type&#34;:&#34; ID&#34; &#34; _id&#34:4,&#34; _score&#34;:1}]

你可以编写一个方法,通过迭代JSON数组

来设置相应对象的值