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 数据放入我的 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 在@符号更改后响应文本时,它都会输出这个。
您需要对搜索命中和反序列化值执行迭代。
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)
| 归档时间: |
|
| 查看次数: |
3931 次 |
| 最近记录: |