Récupérer la réponse d'une API en JSON

Messages postés
127
Date d'inscription
lundi 24 septembre 2018
Statut
Membre
Dernière intervention
31 octobre 2019
-
Bonjour à tous,

Je dois développer une application qui extrait des donnée d'une autre application (TeamWork) via une de leur API. Je voudrai récupérer la réponse de l'API (qui est en JSON), et la traité dans mon application java, en filtrant pour récupérer seulement les infos qui m'intéresse. Pour cela j'hésite entre 2 solutions : soit utiliser Regex (API java) soit ETL. Je ne sais pas trop qu'elle est leur différence, et comment je dois m'en servir. Des idées ?

Merci
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
16064
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 octobre 2019
2443
1
Merci
Bonjour,

Ça n'a aucun intérêt de repartir d'aussi bas niveau qu'une regex.
Tu devrais directement utiliser les standards de Java EE.

Par exemple : https://cxf.apache.org/docs/jax-rs-client-api.html

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 69546 internautes nous ont dit merci ce mois-ci

Kilkenny95
Messages postés
127
Date d'inscription
lundi 24 septembre 2018
Statut
Membre
Dernière intervention
31 octobre 2019
-
Bonjour, merci de ta réponse, mais je ne m'y connais pas trop, et ce que je trouve sur internet me semble confus... Peux tu m'expliquer rapidement ce que c'est ?
Commenter la réponse de KX
Messages postés
5259
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
31 octobre 2019
815
1
Merci
Salut Kilkenny95,

Je ne peux pas répondre pour t'éclairer sur la suggestion de KX, car je ne fais du Java que très occasionnellement.

mais... dans ton cas, est-ce qu'une simple bibliothèque permettant de parser le JSON que tu récupères ne serait pas suffisante ?

Il en existe de nombreuses : https://github.com/fabienrenaud/java-json-benchmark

Celle-ci https://github.com/stleary/JSON-java par exemple (qui n'est pas la meilleure ni la plus optimisée selon le comparatif ci-dessus) est assez simple d'utilisation pour des besoins simples : http://theoryapp.com/parse-json-in-java/

Exemple tiré de ce lien :

String str = "{ \"name\": \"Alice\", \"age\": 20 }";
JSONObject obj = new JSONObject(str);
String n = obj.getString("name");
int a = obj.getInt("age");
System.out.println(n + " " + a);  // prints "Alice 20"


Tu as un topic SO sur la question : https://stackoverflow.com/questions/2591098/how-to-parse-json-in-java

Dal

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 69546 internautes nous ont dit merci ce mois-ci

Commenter la réponse de [Dal]
Messages postés
16064
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 octobre 2019
2443
1
Merci
Bonjour,

Voici un exemple de service REST https://jsonplaceholder.typicode.com/users qui liste des utilisateurs.

Avec CXF pour la partie JAX-RS et Jackson pour la partie JSON, je peux écrire ce code :
import java.util.List;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.Response;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

@JsonIgnoreProperties(ignoreUnknown=true)
class User {
    @JsonProperty("name")
    public String name;
    
    @JsonProperty("address")
    public Address address;
}

@JsonIgnoreProperties(ignoreUnknown = true)
class Address {
    @JsonProperty("city")
    public String city;
}

public class Application {
    public static void main(String[] args) {
        Response response = ClientBuilder.newClient().register(JacksonJsonProvider.class)
                .target("https://jsonplaceholder.typicode.com/").path("users")
                .request().get();

        List<User> users = response.readEntity(new GenericType<List<User>>() {});
        for (User user : users) {
            System.out.println(user.name + " : " + user.address.city);
        }
    }
}

Remarque : il faut bien sûr ajouter les dépendances sur CXF et Jackson, par exemple avec Maven :
<dependencies>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-client</artifactId>
        <version>3.0.15</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.10.0</version>
    </dependency>
</dependencies>

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 69546 internautes nous ont dit merci ce mois-ci

Kilkenny95
Messages postés
127
Date d'inscription
lundi 24 septembre 2018
Statut
Membre
Dernière intervention
31 octobre 2019
-
merci, mais je ne vois pas du tout ce qu'est une dependances CXF ou Jackson.
De plus, je n'arrive pas à générer mes classes java avec mon JSON avec jsonschema2pojo....
KX
Messages postés
16064
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 octobre 2019
2443 > Kilkenny95
Messages postés
127
Date d'inscription
lundi 24 septembre 2018
Statut
Membre
Dernière intervention
31 octobre 2019
-
Une dépendance, c'est un morceau de code fourni par quelqu'un d'autre, il faut ajouter les jars correspondants sinon tu ne pourra pas compiler ou exécuter ton code.
Les imports javax.ws.rs.* dépendent de CXF, et les imports com.fasterxml.jackson de Jackson.

Si tu arrives à faire fonctionner mon exemple, ce sera déjà un bon début...

Quant à jsonschema2pojo, c'est un outil parmi d'autres sur internet, qui permet de générer automatiquement du code à partir d'un extrait de JSON ou d'un contrat YAML (l'idéal).
Voici comment j'aurais pu le configurer pour mon exemple, mais tu pourrais très bien coder tes POJO à la main.
Commenter la réponse de KX
Messages postés
127
Date d'inscription
lundi 24 septembre 2018
Statut
Membre
Dernière intervention
31 octobre 2019
0
Merci
Merci beaucoup, je vais tester ça.

J'ai une autre question où tu pourrais peut-être m'aider : j'ai surement besoin d'une base de données pour stocker mes donnée recupérer par mon appli web, puis-utiliser une base Access ? ai-je besoin d'un autre outils pour faire communiquer cette base à mon appli (ormis un JDBC)

Merci à toi
Kilkenny95
Messages postés
127
Date d'inscription
lundi 24 septembre 2018
Statut
Membre
Dernière intervention
31 octobre 2019
-
gin de maven dans mon EClipse, mais quand je run un projet vide : erreur Plugin org.apache.maven.plugins:maven-resources-plugin:2.5 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-resources-plugin:jar:2.5: Could not transfer artifact org.apache.maven.plugins:maven-resources-plugin:pom:2.5 from/to central (http://repo.maven.apache.org/maven2): null to http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.5/maven-resources-plugin-2.5.pom: UnresolvedAddressException -> [Help 1]
[ERROR]
KX
Messages postés
16064
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 octobre 2019
2443 > Kilkenny95
Messages postés
127
Date d'inscription
lundi 24 septembre 2018
Statut
Membre
Dernière intervention
31 octobre 2019
-
Ferme Eclipse, supprime le dossier .m2/repository, lance la commande
mvn clean install eclipse:eclipse
puis ouvre Eclipse.
Kilkenny95
Messages postés
127
Date d'inscription
lundi 24 septembre 2018
Statut
Membre
Dernière intervention
31 octobre 2019
> KX
Messages postés
16064
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 octobre 2019
-
Et mttn quand je run l'appli, j'ai :

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

qui s'affiche dès le début
Kilkenny95
Messages postés
127
Date d'inscription
lundi 24 septembre 2018
Statut
Membre
Dernière intervention
31 octobre 2019
-
Quand je le fais ca me met : C:\Users\x194982>mvn clean install eclipse:eclipse
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.085 s
[INFO] Finished at: 2019-10-31T09:43:50+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (C:\Users\x194982). Please verify you invoked Maven from the correct directory. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MissingProjectException

C:\Users\x194982>
KX
Messages postés
16064
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 octobre 2019
2443 -
Bonjour,

"The goal you specified requires a project to execute but there is no POM in this directory (C:\Users\x194982)"
Il faut exécuter ta ligne de commande à l'endroit du projet, là où il y a le fichier pom.xml, sinon comment il pourrait savoir quel projet tu veux compiler ?

Quant aux messages SLF4J c'est uniquement pour t'informer que n'ayant pas trouvé de fichier de configuration il utilise celle par défaut. Sachant que SLF4J sert à afficher des logs, voir des logs de SLF4J montre bien que ça fonctionne...
Commenter la réponse de Kilkenny95