J'ai donc une base de données elasticsearch, que j'ai utilisée pour stocker les contacts. je fais la requête ci-dessous.

 public String getAllContacts() throws IOException {

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

    return response.toString();
}

Alors j'obtiens un résultat comme celui-ci Résultat Json de la requête

Alors je veux mettre les données Json dans mes objets de classe 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; }
}

Plus tard, mais lorsque j'essaye de mapper le JSON à l'objet en utilisant le code ci-dessous, j'obtiens des erreurs

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

L'une des nombreuses erreurs

Can not deserialize instance of java.util.ArrayList out of START_OBJECT token

Donc le problème que je pense est tout le reste qui vient de la requête si j'obtiens un JSON propre comme celui-ci {"id":"2","name";"dinu"} cela fonctionne (je l'ai testé manuellement) mais il est livré avec beaucoup d'autres choses telles que la partie supérieure de le fichier JSON (métadonnées d'en-tête) (vérifiez l'image de résultat JSON ci-dessus).

Donc je pense que j'ai 2 options: -

Option 1 : - obtenir un résultat propre d'elasticsearch DB, je dois donc modifier la requête de recherche. je ne sais pas si cela est même possible avec elasticsearch. si tel est le cas, quelqu'un peut-il suggérer comment modifier la requête (dans l'API java).

Option 2 : - filtrez le fichier JSON et supprimez tous les éléments indésirables, puis transformez-le en objet Contact. J'ai essayé GSON et jackson ont tous deux échoué avec le fichier non filtré. S'il existe un moyen avancé ou personnalisé de filtrer, faites le moi savoir.

Option 3 : - Je me trompe totalement et il existe un moyen plus simple de le faire.Veuillez me le faire savoir.

MISE À JOUR Regardez CECI: - https://www.youtube.com/watch?v=YgKcVBbvy2U

Donc j'ai essayé la manière ci-dessus en utilisant GSON pour sérialiser

Alors les exceptions ne viennent pas, mais j'obtiens les réponses après la sérialisation comme "Inattendu 'd'" également au format brut, il produit ce dinu.model.HitsObject@6c79684b chaque fois que j'envoie un GET répond au texte après @ changements de symbole '.

3
Dinushka 25 nov. 2017 à 17:53

3 réponses

Meilleure réponse

Vous devez effectuer une itération sur les résultats de recherche et dé-sérialiser la valeur.

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);
}

Si vous avez besoin de le sérialiser à nouveau en tant que liste json, vous pouvez simplement obtenir en tant que JSON

String lstString = mapper.writeValueAsString(lst);

Le ObjectMapper mentionné ci-dessus provient de la bibliothèque de liaison de données jackson. C'est plutôt sympa que Gson

import com.fasterxml.jackson.databind.ObjectMapper;
5
raslan 28 nov. 2017 à 07:21

Je ne sais pas si cela vous aide à obtenir ce que vous recherchez. Je viens d'ajouter votre chaîne à un fichier texte

Object obj = new JSONParser (). Parse (new FileReader ("data.txt"));

    // 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);

[{"_index": "contact", "_ type": "id", "_ id": 2, "_ score": 1}, {"_ index": "contact", "_ type": "id", "_ id ": 4," _ score ": 1}]

Vous pouvez probablement écrire une méthode qui peut définir des valeurs pour les objets correspondants en itérant le tableau JSON

0
Anup 26 nov. 2017 à 05:46

A partir de la réponse JSON, la balise hits: doit être la liste qui contient les attributs index, type, id, score, source..etc. Veuillez essayer de récupérer l'objet de la liste des hits qui contient les objets qui ont le contact

0
Anup 25 nov. 2017 à 15:45
47487277