所以我有一个用于存储联系人的elasticsearch数据库。我做下面的查询。
public String getAllContacts() throws IOException {
SearchResponse response = client.prepareSearch("contact").get();
return response.toString();
}
然后我想将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结果图像)。
所以我想我有2种选择:-
选项1:-从Elasticsearch DB获得干净的结果,因此我需要修改搜索查询。我不知道弹性搜索是否有可能。如果是这样,有人可以提出有关如何修改查询的建议(在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);
}
如果您需要再次将其序列化为JSON列表,则只需将其获取为JSON
String lstString = mapper.writeValueAsString(lst);
上面提到的ObjectMapper
是来自杰克逊的数据绑定库。比Gson还不错
import com.fasterxml.jackson.databind.ObjectMapper;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句