Elasticsearch Java API查询JSON解析器

迪努什卡:

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

 public String getAllContacts() throws IOException {

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

    return response.toString();
}

所以我从查询中得到像这样的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; }
}

后来我但是当我尝试使用以下代码将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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章