所以我有一个弹性搜索数据库,我用来存储联系人。我做以下查询。
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
。
答案 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数组
来设置相应对象的值