Come analizzare in modo efficiente una risposta di Rest Api che si evolve ogni volta
Non sono un programmatore, quindi mi mancano le conoscenze di base.
Voglio creare un'app desktop, un dizionario, cerchi una parola, hai una breve definizione.
Io uso quei ragazzi.
https://api.lexicala.com/
Quindi ecco parte del mio script qui sotto.
Il mio problema è che per ogni parte che cerco, il significato della parola, la sua natura, ecc.
Devo creare queste righe di codice di decapsulazione. // Modifica: decapsulazione = deserializzazione
response.getBody().getObject().getJSONArray("results").getJSONObject(0).getJSONObject("headword").get("text")
Se il Json non cambiava ogni volta, nessun problema, ma lo fa.
Un aggettivo e un nome cambiano completamente la struttura e ottengo un errore.
Un oggetto Json è ora un array Json.
Vorrei sapere se esiste un modo semplice, Jackson, o Gson o Json, per chiedere semplicemente qualcosa di simile
Json.Parse (JsonResponse);
get("Definition");
Invece di
Object Resultat4 = response.getBody().getObject().getJSONArray("results").getJSONObject(0).getJSONArray("senses").getJSONObject(0).get("definition");
E avere solo il contenuto, senza passare da tutte queste linee di codici mutevoli.
Grazie per avermi aiutato in questo.
//Values
String motacherch = "grand";
public void gettest(){
HttpResponse<JsonNode> response = Unirest.get("https://dictapi.lexicala.com/search?source=global&language=fr&text="+motacherch)
.basicAuth("user", "password")
.asJson();
JSONObject responsejson = (JSONObject) response.getBody().getObject();
System.out.println( responsejson);
Object Resultat = response.getBody().getObject().get("n_results");
System.out.println( "Le nombre de resultats est:"+ Resultat);
Object Resultat2 = response.getBody().getObject().getJSONArray("results").getJSONObject(0).getJSONObject("headword").get("text");
System.out.println( "Le mot que l'on cherche est: "+ Resultat2);
Object Resultat3 = response.getBody().getObject().getJSONArray("results").getJSONObject(0).getJSONObject("headword").get("pos");
System.out.println( "C'est un: "+ Resultat3);
Object Resultat4 = response.getBody().getObject().getJSONArray("results").getJSONObject(0).getJSONArray("senses").getJSONObject(0).get("definition");
System.out.println( "Definition: "+ Resultat4);
System.out.println( "---------------------------------------------" );
HttpResponse<JsonNode> response2 = Unirest.get("https://dictapi.lexicala.com/users/me")
.basicAuth("", "")
.asJson();
//System.out.println( response2.getBody());
JSONObject responsejson2 = response2.getBody().getObject();
JSONObject results = responsejson2.getJSONObject("usage").getJSONObject("today");
Object results2=results.get("count");
System.out.println( results2);
}
Risposte
Il modo più semplice è analizzare (deserializzare) il json in un java Map<String, Object>, che ha sempre successo (i valori stessi possono essere mappe) usando la tua libreria preferita (prova Jackson o gson).
Quindi esamina le chiavi della mappa per capire cosa farne.
Il modo più difficile, ma più "corretto" è deserializzare una varietà di classi scelte dagli attributi del payload, ma in questo caso non lo farei, poiché il design dell'API sembra un po 'instabile.
Ecco del codice per analizzare json in una mappa:
import com.fasterxml.jackson.databind.ObjectMapper;
Map<String, Object> map = (HashMap<String, Object>) new ObjectMapper().readValue(jsonStr, LinkedHashMap.class); // LinkedHashMap will preserve order
Per rendere più facile l'accesso ai valori della mappa, potresti trovare questo metodo di supporto che esegue il cast per inferenza a portata di mano:
static <T> T getValue(Map<String, Object> map, String key) {
return (T)map.get(key);
}
Usalo in questo modo:
List<Map<String, Object>> list = getValue(map, "results"); // no cast needed
Il Json:
{"n_results":1,"page_number":1,"results_per_page":10,"n_pages":1,"available_n_pages":1,"results":[{"id":"FR_DE00114905","language":"fr","headword":{"text":"briser","pos":"verb"},"senses":[{"id":"FR_SE00126791","definition":"réduire en morceaux"},{"id":"FR_SE00002638","definition":"détruire"}]}]}
Parte del codice:
String motacherch = "briser";
public void gettest() throws IOException {
HttpResponse<JsonNode> response = Unirest.get("https://dictapi.lexicala.com/search?source=global&language=fr&text="+motacherch)
.basicAuth("user", "password")
.asJson();
System.out.println( "---------------------------------------------" );
JSONObject responsejson = (JSONObject) response.getBody().getObject();
System.out.println( responsejson);
System.out.println( "---------------------------------------------" );
Map<String, Object> map;
map = (HashMap<String, Object>) new ObjectMapper().readValue(responsejson.toString(), LinkedHashMap.class);
System.out.println(map.get("results"));
System.out.println( "---------------------------------------------" );
List<Map<String, Object>> results = (List<Map<String, Object>>)map.get("results");
System.out.println( results.get(0).get("id") );
System.out.println( results.get(0).get("senses") );
List<Map<String, Object>> results33 = (List<Map<String, Object>>)results.get(0).get("senses");
System.out.println( results33.get(0).get("definition") );
System.out.println( results33.get(1).get("definition") );
}