Elasticsearch Java api 查询 JSON 解析器

Din*_*hka 3 java json elasticsearch

所以我有一个 elasticsearch 数据库,我用来存储联系人。我做下面的查询。

 public String getAllContacts() throws IOException {

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

    return response.toString();
}
Run Code Online (Sandbox Code Playgroud)

所以我从查询中得到了这样的 Json 结果

然后我想将 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; }
}
Run Code Online (Sandbox Code Playgroud)

后来我但是当我尝试使用下面的代码将 JSON 映射到对象时,我收到错误

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

许多错误之一

Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
Run Code Online (Sandbox Code Playgroud)

所以我认为问题是来自查询的所有其他内容,如果我得到这样的干净 JSON{"id":"2","name";"dinu"}它可以工作(我确实手动测试了它)但它带有许多其他内容,例如 JSON 文件的顶部(标题元数据)(检查上面的 JSON 结果图像)。

所以我想我有两个选择:-

选项 1:- 从 elasticsearch DB 中获得干净的结果,因此我需要修改搜索查询。我不知道这是否可以通过 elasticsearch 实现。如果是这样,有人可以就如何修改查询提出建议(在 Java API 中)。

选项 2 :- 过滤掉 JSON 文件并删除所有不需要的东西,然后将其放入 Contact 对象。我尝试过 GSON 和 jackson 都因未过滤的文件而失败。如果有任何提前或自定义的过滤方式,请告诉我。

选项 3 :- 我完全错了,有一个更好的简单方法来做到这一点。请告诉我。

更新 观看:- https://www.youtube.com/watch?v=YgKcVBbvy2U

所以我尝试了上述使用 GSON 序列化的方法

然后异常不会出现,但我在序列化后得到响应为“意外的'd'”,也是原始dinu.model.HitsObject@6c79684b 格式,每次我发送 GET 在@符号更改后响应文本时,它都会输出这个。

ras*_*lan 6

您需要对搜索命中和反序列化值执行迭代。

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);
}
Run Code Online (Sandbox Code Playgroud)

如果您需要再次将其序列化为 json 列表,您可以简单地将其作为 JSON

String lstString = mapper.writeValueAsString(lst);
Run Code Online (Sandbox Code Playgroud)

上面提到的ObjectMapper是来自杰克逊数据绑定库。比Gson好看

import com.fasterxml.jackson.databind.ObjectMapper;
Run Code Online (Sandbox Code Playgroud)