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 réponses
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;
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
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
Questions connexes
De nouvelles questions
java
Java est un langage de programmation de haut niveau. Utilisez cette balise lorsque vous rencontrez des problèmes pour utiliser ou comprendre la langue elle-même. Cette balise est rarement utilisée seule et est le plus souvent utilisée en conjonction avec [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] et [maven].