J'ai le texte JSON suivant. Comment puis-je l'analyser pour obtenir les valeurs de pageName
, pagePic
, post_id
, etc.?
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
},
"posts": [
{
"post_id": "123456789012_123456789012",
"actor_id": "1234567890",
"picOfPersonWhoPosted": "http://example.com/photo.jpg",
"nameOfPersonWhoPosted": "Jane Doe",
"message": "Sounds cool. Can't wait to see it!",
"likesCount": "2",
"comments": [],
"timeOfPost": "1234567890"
}
]
}
La bibliothèque org.json est facile à utiliser. Exemple de code ci-dessous:
import org.json.*;
JSONObject obj = new JSONObject(" .... ");
String pageName = obj.getJSONObject("pageInfo").getString("pageName");
JSONArray arr = obj.getJSONArray("posts");
for (int i = 0; i < arr.length(); i++)
{
String post_id = arr.getJSONObject(i).getString("post_id");
......
}
Vous pouvez trouver plus d'exemples de: Parse JSON en Java
Jarre téléchargeable: http://mvnrepository.com/artifact/org.json/json
Par exemple, supposons que vous ayez une classe Person
avec juste un name
.
private class Person {
public String name;
public Person(String name) {
this.name = name;
}
}
Mon favori personnel quant à la grande sérialisation JSON/dé-sérialisation des objets.
Gson g = new Gson();
Person person = g.fromJson("{\"name\": \"John\"}", Person.class);
System.out.println(person.name); //John
System.out.println(g.toJson(person)); // {"name":"John"}
Mettre à jour
Si vous souhaitez obtenir un seul attribut, vous pouvez également le faire facilement avec la bibliothèque Google:
JsonObject jsonObject = new JsonParser().parse("{\"name\": \"John\"}").getAsJsonObject();
System.out.println(jsonObject.get("name").getAsString()); //John
Si vous n'avez pas besoin de la désérialisation d'objet mais simplement d'obtenir un attribut, vous pouvez essayer org.json ( ou regarder l'exemple GSON ci-dessus! )
JSONObject obj = new JSONObject("{\"name\": \"John\"}");
System.out.println(obj.getString("name")); //John
ObjectMapper mapper = new ObjectMapper();
Person user = mapper.readValue("{\"name\": \"John\"}", Person.class);
System.out.println(user.name); //John
Si vous voulez créer un objet Java à partir de JSON et inversement, utilisez des fichiers tiers tels que GSON ou JACKSON.
//from object to JSON
Gson gson = new Gson();
gson.toJson(yourObject);
// from JSON to object
yourObject o = gson.fromJson(JSONString,yourObject.class);
Mais si on veut seulement analyser une chaîne JSON et obtenir des valeurs, (OU créer une chaîne JSON à partir de zéro pour l'envoyer sur le réseau), utilisez simplement le jar JaveEE qui contient JsonReader, JsonArray, JsonObject, etc. Vous pouvez télécharger l'implémentation de celui-ci. spec comme javax.json. Avec ces deux pots, je suis capable d'analyser le JSON et d'utiliser les valeurs.
Ces API suivent en réalité le modèle d’analyse DOM/SAX de XML.
Response response = request.get(); // REST call
JsonReader jsonReader = Json.createReader(new StringReader(response.readEntity(String.class)));
JsonArray jsonArray = jsonReader.readArray();
ListIterator l = jsonArray.listIterator();
while ( l.hasNext() ) {
JsonObject j = (JsonObject)l.next();
JsonObject ciAttr = j.getJsonObject("ciAttributes");
quick-json parser est très simple, flexible, très rapide et personnalisable. L'essayer
Fonctionnalités:
Il peut être utilisé comme ceci:
JsonParserFactory factory=JsonParserFactory.getInstance();
JSONParser parser=factory.newJsonParser();
Map jsonMap=parser.parseJson(jsonString);
Vous pouvez utiliser les bibliothèques Jackson pour relier JSON String à POJO ( Plain Old Java Object ) instances. POJO est simplement une classe avec uniquement des champs privés et des méthodes de lecture/définition publiques. Jackson va parcourir les méthodes (à l'aide de réflexion) et mappe l'objet JSON dans l'instance POJO lorsque les noms de champ de la classe correspondent aux noms de champ de l'objet JSON.
Dans votre objet JSON, qui est en fait un objet composite, l'objet principal est constitué de deux sous-objets. Ainsi, nos classes POJO devraient avoir la même hiérarchie. J'appellerai l'objet JSON entier en tant qu'objet Page. Page objet se compose d'un objet PageInfo, et d'un tableau Post.
Nous devons donc créer trois classes POJO différentes;
Le seul package que j'ai utilisé est Jackson ObjectMapper, ce que nous faisons est de lier des données.
com.fasterxml.jackson.databind.ObjectMapper
Les dépendances requises, les fichiers jar sont énumérés ci-dessous;
Voici le code requis;
package com.levo.jsonex.model;
public class Page {
private PageInfo pageInfo;
private Post[] posts;
public PageInfo getPageInfo() {
return pageInfo;
}
public void setPageInfo(PageInfo pageInfo) {
this.pageInfo = pageInfo;
}
public Post[] getPosts() {
return posts;
}
public void setPosts(Post[] posts) {
this.posts = posts;
}
}
package com.levo.jsonex.model;
public class PageInfo {
private String pageName;
private String pagePic;
public String getPageName() {
return pageName;
}
public void setPageName(String pageName) {
this.pageName = pageName;
}
public String getPagePic() {
return pagePic;
}
public void setPagePic(String pagePic) {
this.pagePic = pagePic;
}
}
package com.levo.jsonex.model;
public class Post {
private String post_id;
private String actor_id;
private String picOfPersonWhoPosted;
private String nameOfPersonWhoPosted;
private String message;
private int likesCount;
private String[] comments;
private int timeOfPost;
public String getPost_id() {
return post_id;
}
public void setPost_id(String post_id) {
this.post_id = post_id;
}
public String getActor_id() {
return actor_id;
}
public void setActor_id(String actor_id) {
this.actor_id = actor_id;
}
public String getPicOfPersonWhoPosted() {
return picOfPersonWhoPosted;
}
public void setPicOfPersonWhoPosted(String picOfPersonWhoPosted) {
this.picOfPersonWhoPosted = picOfPersonWhoPosted;
}
public String getNameOfPersonWhoPosted() {
return nameOfPersonWhoPosted;
}
public void setNameOfPersonWhoPosted(String nameOfPersonWhoPosted) {
this.nameOfPersonWhoPosted = nameOfPersonWhoPosted;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getLikesCount() {
return likesCount;
}
public void setLikesCount(int likesCount) {
this.likesCount = likesCount;
}
public String[] getComments() {
return comments;
}
public void setComments(String[] comments) {
this.comments = comments;
}
public int getTimeOfPost() {
return timeOfPost;
}
public void setTimeOfPost(int timeOfPost) {
this.timeOfPost = timeOfPost;
}
}
Je viens de copier votre exemple JSON dans ce fichier et de le placer dans le dossier du projet.
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
},
"posts": [
{
"post_id": "123456789012_123456789012",
"actor_id": "1234567890",
"picOfPersonWhoPosted": "http://example.com/photo.jpg",
"nameOfPersonWhoPosted": "Jane Doe",
"message": "Sounds cool. Can't wait to see it!",
"likesCount": "2",
"comments": [],
"timeOfPost": "1234567890"
}
]
}
package com.levo.jsonex;
import Java.io.File;
import Java.io.IOException;
import Java.util.Arrays;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.levo.jsonex.model.Page;
import com.levo.jsonex.model.PageInfo;
import com.levo.jsonex.model.Post;
public class JSONDemo {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
try {
Page page = objectMapper.readValue(new File("sampleJSONFile.json"), Page.class);
printParsedObject(page);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void printParsedObject(Page page) {
printPageInfo(page.getPageInfo());
System.out.println();
printPosts(page.getPosts());
}
private static void printPageInfo(PageInfo pageInfo) {
System.out.println("Page Info;");
System.out.println("**********");
System.out.println("\tPage Name : " + pageInfo.getPageName());
System.out.println("\tPage Pic : " + pageInfo.getPagePic());
}
private static void printPosts(Post[] posts) {
System.out.println("Page Posts;");
System.out.println("**********");
for(Post post : posts) {
printPost(post);
}
}
private static void printPost(Post post) {
System.out.println("\tPost Id : " + post.getPost_id());
System.out.println("\tActor Id : " + post.getActor_id());
System.out.println("\tPic Of Person Who Posted : " + post.getPicOfPersonWhoPosted());
System.out.println("\tName Of Person Who Posted : " + post.getNameOfPersonWhoPosted());
System.out.println("\tMessage : " + post.getMessage());
System.out.println("\tLikes Count : " + post.getLikesCount());
System.out.println("\tComments : " + Arrays.toString(post.getComments()));
System.out.println("\tTime Of Post : " + post.getTimeOfPost());
}
}
Page Info;
****(*****
Page Name : abc
Page Pic : http://example.com/content.jpg
Page Posts;
**********
Post Id : 123456789012_123456789012
Actor Id : 1234567890
Pic Of Person Who Posted : http://example.com/photo.jpg
Name Of Person Who Posted : Jane Doe
Message : Sounds cool. Can't wait to see it!
Likes Count : 2
Comments : []
Time Of Post : 1234567890
Presque toutes les réponses fournies nécessitent une désérialisation complète du JSON en un objet Java avant d'accéder à la valeur de la propriété d'intérêt. Une autre alternative, qui ne va pas dans cette voie, consiste à utiliser JsonPATH , qui ressemble à XPath pour JSON et permet de parcourir les objets JSON.
C'est une spécification et les gens de JayWay ont créé une implémentation de la spécification Java que vous pouvez trouver ici: https://github.com/jayway/JsonPath
Donc, fondamentalement, pour l’utiliser, ajoutez-le à votre projet, par exemple:
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>${version}</version>
</dependency>
et à utiliser:
String pageName = JsonPath.read(yourJsonString, "$.pageInfo.pageName");
String pagePic = JsonPath.read(yourJsonString, "$.pageInfo.pagePic");
String post_id = JsonPath.read(yourJsonString, "$.pagePosts[0].post_id");
etc...
Consultez la page de spécification JsonPath pour plus d'informations sur les autres manières de traverser JSON.
Vous pouvez utiliser Google Gson .
En utilisant cette bibliothèque, il vous suffit de créer un modèle avec la même structure JSON. Le modèle est ensuite automatiquement renseigné. Vous devez appeler vos variables en tant que clés JSON ou utiliser @SerializedName si vous souhaitez utiliser des noms différents.
Pour votre exemple:
JSON:
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
}
"posts": [
{
"post_id": "123456789012_123456789012",
"actor_id": "1234567890",
"picOfPersonWhoPosted": "http://example.com/photo.jpg",
"nameOfPersonWhoPosted": "Jane Doe",
"message": "Sounds cool. Can't wait to see it!",
"likesCount": "2",
"comments": [],
"timeOfPost": "1234567890"
}
]
}
Modèle:
class MyModel {
private PageInfo pageInfo;
private ArrayList<Post> posts = new ArrayList<>();
}
class PageInfo {
private String pageName;
private String pagePic;
}
class Post {
private String post_id;
@SerializedName("actor_id") // <- example SerializedName
private String actorId;
private String picOfPersonWhoPosted;
private String nameOfPersonWhoPosted;
private String message;
private String likesCount;
private ArrayList<String> comments;
private String timeOfPost;
}
Maintenant, vous pouvez analyser en utilisant la bibliothèque Gson:
MyModel model = gson.fromJson(jsonString, MyModel.class);
Vous pouvez générer un modèle à partir de JSON automatiquement à l'aide d'outils en ligne tels que this .
Utilisez minimal-json qui est très rapide et facile à utiliser. Vous pouvez analyser à partir de String obj et Stream.
Échantillon de données:
{
"order": 4711,
"items": [
{
"name": "NE555 Timer IC",
"cat-id": "645723",
"quantity": 10,
},
{
"name": "LM358N OpAmp IC",
"cat-id": "764525",
"quantity": 2
}
]
}
Analyse:
JsonObject object = Json.parse(input).asObject();
int orders = object.get("order").asInt();
JsonArray items = object.get("items").asArray();
Création de JSON:
JsonObject user = Json.object().add("name", "Sakib").add("age", 23);
Maven:
<dependency>
<groupId>com.eclipsesource.minimal-json</groupId>
<artifactId>minimal-json</artifactId>
<version>0.9.4</version>
</dependency>
Je pense que la meilleure pratique devrait être de passer par la version officielle Java JSON API qui est toujours en cours de développement.
L'exemple ci-dessous montre comment lire le texte de la question, représenté par la variable "jsonText". Cette solution utilise l'API Java EE7 javax.json (mentionnée dans certaines des autres réponses). La raison pour laquelle je l'ai ajouté en tant que réponse distincte est que le code suivant montre comment accéder en fait à certaines des valeurs indiquées dans la question. Un implémentation de l'API javax.json serait nécessaire pour que ce code soit exécuté. Le package complet pour chacune des classes requises était inclus car je ne voulais pas déclarer d'instructions "d'importation".
javax.json.JsonReader jr =
javax.json.Json.createReader(new StringReader(jsonText));
javax.json.JsonObject jo = jr.readObject();
//Read the page info.
javax.json.JsonObject pageInfo = jo.getJsonObject("pageInfo");
System.out.println(pageInfo.getString("pageName"));
//Read the posts.
javax.json.JsonArray posts = jo.getJsonArray("posts");
//Read the first post.
javax.json.JsonObject post = posts.getJsonObject(0);
//Read the post_id field.
String postId = post.getString("post_id");
Maintenant, avant que quiconque ne veuille réduire la réponse parce qu'il n'utilise pas GSON, org.json, Jackson ou aucun des autres frameworks tiers disponibles, il s'agit d'un exemple de "code requis" par la question pour analyser le texte fourni. Je suis bien conscient que l'adhésion à la norme actuelle JSR 353 n'était pas envisagée pour JDK 9 et en tant que telle, le JSR 353 spec devrait être traité de la même manière que tout autre tiers. Mise en œuvre de la gestion JSON.
Comme personne ne l’a encore mentionné, voici le début d’une solution utilisant Nashorn (composant d’exécution JavaScript de Java 8, mais obsolète dans Java 11).
Solution
private static final String EXTRACTOR_SCRIPT =
"var fun = function(raw) { " +
"var json = JSON.parse(raw); " +
"return [json.pageInfo.pageName, json.pageInfo.pagePic, json.posts[0].post_id];};";
public void run() throws ScriptException, NoSuchMethodException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(EXTRACTOR_SCRIPT);
Invocable invocable = (Invocable) engine;
JSObject result = (JSObject) invocable.invokeFunction("fun", JSON);
result.values().forEach(e -> System.out.println(e));
}
Comparaison des performances
J'ai écrit du contenu JSON contenant trois tableaux de respectivement 20, 20 et 100 éléments. Je veux seulement obtenir les 100 éléments du troisième tableau. J'utilise la fonction JavaScript suivante pour analyser et obtenir mes entrées.
var fun = function(raw) {JSON.parse(raw).entries};
L'exécution de l'appel un million de fois à l'aide de Nashorn prend entre 7,5 et 7,8 secondes.
(JSObject) invocable.invokeFunction("fun", json);
org.json prend 20 ~ 21 secondes
new JSONObject(JSON).getJSONArray("entries");
Jackson prend 6,5 ~ 7 secondes
mapper.readValue(JSON, Entries.class).getEntries();
Dans ce cas, Jackson fonctionne mieux que Nashorn, qui fonctionne beaucoup mieux que org.json. L'API de Nashorn est plus difficile à utiliser que celle de org.json ou de Jackson. Selon vos besoins, Jackson et Nashorn peuvent constituer des solutions viables.
Cela m'a frappé avec la facilité. Vous pouvez simplement passer un String
contenant votre code JSON au constructeur d'un objet JSON dans le package org.json par défaut.
JSONArray rootOfPage = new JSONArray(JSONString);
Terminé. Microphone baisse. Cela fonctionne aussi avec JSONObjects
. Après cela, vous pouvez simplement parcourir votre hiérarchie de Objects
en utilisant les méthodes get()
de vos objets.
Il existe de nombreuses bibliothèques JSON disponibles en Java.
Les plus notoires sont: Jackson, GSON, Genson, FastJson et org.json.
Il y a généralement trois choses à considérer pour choisir une bibliothèque:
Spécifiquement pour les bibliothèques JSON (et toutes les bibliothèques de sérialisation/désérialisation), la liaison de données présente également un intérêt, car elle supprime la nécessité d'écrire du code de plaque chauffante pour compresser/décompresser les données.
Pour 1, voir ce repère: https://github.com/fabienrenaud/Java-json-benchmark J'ai utilisé JMH qui compare (jackson, gson, genson). , fastjson, org.json, jsonp) performances des sérialiseurs et des desérialisateurs à l'aide d'API stream et databind. Pour 2, vous pouvez trouver de nombreux exemples sur Internet. Le repère ci-dessus peut également être utilisé comme source d’exemples ...
Résultat rapide: Jackson est 5 à 6 fois meilleur que org.json et plus de deux fois meilleur que GSON.
Pour votre exemple particulier, le code suivant décode votre json avec jackson:
public class MyObj {
private PageInfo pageInfo;
private List<Post> posts;
static final class PageInfo {
private String pageName;
private String pagePic;
}
static final class Post {
private String post_id;
@JsonProperty("actor_id");
private String actorId;
@JsonProperty("picOfPersonWhoPosted")
private String pictureOfPoster;
@JsonProperty("nameOfPersonWhoPosted")
private String nameOfPoster;
private String likesCount;
private List<String> comments;
private String timeOfPost;
}
private static final ObjectMapper JACKSON = new ObjectMapper();
public static void main(String[] args) throws IOException {
MyObj o = JACKSON.readValue(args[0], MyObj.class); // assumes args[0] contains your json payload provided in your question.
}
}
Faites moi savoir si vous avez des questions.
En plus d'autres réponses, je recommande ce service opensource en ligne jsonschema2pojo.org pour générer rapidement des classes Java à partir de schémas json ou json pour GSON, Jackson 1.x ou Jackson 2.x . Par exemple, si vous avez:
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
}
"posts": [
{
"post_id": "123456789012_123456789012",
"actor_id": 1234567890,
"picOfPersonWhoPosted": "http://example.com/photo.jpg",
"nameOfPersonWhoPosted": "Jane Doe",
"message": "Sounds cool. Can't wait to see it!",
"likesCount": 2,
"comments": [],
"timeOfPost": 1234567890
}
]
}
Le jsonschema2pojo.org pour GSON a généré:
@Generated("org.jsonschema2pojo")
public class Container {
@SerializedName("pageInfo")
@Expose
public PageInfo pageInfo;
@SerializedName("posts")
@Expose
public List<Post> posts = new ArrayList<Post>();
}
@Generated("org.jsonschema2pojo")
public class PageInfo {
@SerializedName("pageName")
@Expose
public String pageName;
@SerializedName("pagePic")
@Expose
public String pagePic;
}
@Generated("org.jsonschema2pojo")
public class Post {
@SerializedName("post_id")
@Expose
public String postId;
@SerializedName("actor_id")
@Expose
public long actorId;
@SerializedName("picOfPersonWhoPosted")
@Expose
public String picOfPersonWhoPosted;
@SerializedName("nameOfPersonWhoPosted")
@Expose
public String nameOfPersonWhoPosted;
@SerializedName("message")
@Expose
public String message;
@SerializedName("likesCount")
@Expose
public long likesCount;
@SerializedName("comments")
@Expose
public List<Object> comments = new ArrayList<Object>();
@SerializedName("timeOfPost")
@Expose
public long timeOfPost;
}
Il existe de nombreuses bibliothèques open source pour analyser le contenu JSON en un objet ou simplement pour lire les valeurs JSON. Votre exigence est simplement de lire les valeurs et de les analyser en objet personnalisé. La bibliothèque org.json est donc suffisante dans votre cas.
Utilisez la bibliothèque org.json pour l'analyser et créer JsonObject:
JSONObject jsonObj = new JSONObject(<jsonStr>);
Maintenant, utilisez cet objet pour obtenir vos valeurs:
String id = jsonObj.getString("pageInfo");
Vous pouvez voir un exemple complet ici:
Si vous avez une classe Java (par exemple, Message) représentant la chaîne JSON (jsonString), vous pouvez utiliser la bibliothèque JSON Jackson avec:
Message message= new ObjectMapper().readValue(jsonString, Message.class);
et à partir de l'objet message, vous pouvez récupérer n'importe lequel de ses attributs.
Gson est facile à apprendre et à mettre en œuvre. Ce que nous devons savoir, suivent deux méthodes.
toJson () - Convertit l'objet Java au format JSON
fromJson () - Convertir JSON en objet Java
`
import Java.io.BufferedReader;
import Java.io.FileReader;
import Java.io.IOException;
import com.google.gson.Gson;
public class GsonExample {
public static void main(String[] args) {
Gson gson = new Gson();
try {
BufferedReader br = new BufferedReader(
new FileReader("c:\\file.json"));
//convert the json string back to object
DataObject obj = gson.fromJson(br, DataObject.class);
System.out.println(obj);
} catch (IOException e) {
e.printStackTrace();
}
}
}
`
S'il vous plaît faire quelque chose comme ça:
JSONParser jsonParser = new JSONParser();
JSONObject obj = (JSONObject) jsonParser.parse(contentString);
String product = (String) jsonObject.get("productId");
Vous pouvez utiliser la bibliothèque Gson pour analyser la chaîne JSON.
Gson gson = new Gson();
JsonObject jsonObject = gson.fromJson(jsonAsString, JsonObject.class);
String pageName = jsonObject.getAsJsonObject("pageInfo").get("pageName").getAsString();
String pagePic = jsonObject.getAsJsonObject("pageInfo").get("pagePic").getAsString();
String postId = jsonObject.getAsJsonArray("posts").get(0).getAsJsonObject().get("post_id").getAsString();
Vous pouvez également parcourir le tableau "posts" de la manière suivante:
JsonArray posts = jsonObject.getAsJsonArray("posts");
for (JsonElement post : posts) {
String postId = post.getAsJsonObject().get("post_id").getAsString();
//do something
}
Lisez le blog suivant, JSON en Java .
Ce message est un peu vieux, mais je veux quand même répondre à votre question.
Étape 1: Créez une classe POJO de vos données.
Étape 2: Créez maintenant un objet en utilisant JSON.
Employee employee = null;
ObjectMapper mapper = new ObjectMapper();
try{
employee = mapper.readValue(newFile("/home/sumit/employee.json"), Employee.class);
}
catch (JsonGenerationException e){
e.printStackTrace();
}
Pour plus de références, vous pouvez vous référer au suivant lien .
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
},
"posts": [
{
"post_id": "123456789012_123456789012",
"actor_id": "1234567890",
"picOfPersonWhoPosted": "http://example.com/photo.jpg",
"nameOfPersonWhoPosted": "Jane Doe",
"message": "Sounds cool. Can't wait to see it!",
"likesCount": "2",
"comments": [],
"timeOfPost": "1234567890"
}
]
}
Java code :
JSONObject obj = new JSONObject(responsejsonobj);
String pageName = obj.getJSONObject("pageInfo").getString("pageName");
JSONArray arr = obj.getJSONArray("posts");
for (int i = 0; i < arr.length(); i++)
{
String post_id = arr.getJSONObject(i).getString("post_id");
......etc
}
Vous devez d'abord sélectionner une bibliothèque d'implémentation pour le faire.
L'API Java pour le traitement JSON (JSR 353) fournit des API portables permettant d'analyser, de générer, de transformer et d'interroger JSON à l'aide d'un modèle d'objet et d'une API de diffusion en continu.
L'implémentation de référence est ici: https://jsonp.Java.net/
Vous trouverez ici une liste des implémentations de JSR 353:
Quelles sont les API qui implémentent JSR-353 (JSON)
Et pour vous aider à décider ... J'ai aussi trouvé cet article:
http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/
Si vous optez pour Jackson, voici un bon article sur la conversion JSON vers/de Java utilisant Jackson: https://www.mkyong.com/Java/how-to-convert- Objet-a-de-json-jackson /
J'espère que ça aide!
Les réponses les plus fréquentes sur cette page utilisent des exemples trop simples, tels qu'un objet avec une propriété (par exemple, {nom: valeur}). Je pense que cet exemple de vie simple mais réel peut aider quelqu'un.
Voici donc le JSON renvoyé par l'API Google Translate:
{
"data":
{
"translations":
[
{
"translatedText": "Arbeit"
}
]
}
}
Je veux récupérer la valeur de l'attribut "translateText", par exemple. "Arbeit" en utilisant Google Gson.
Deux approches possibles:
Récupérer un seul attribut nécessaire
String json = callToTranslateApi("work", "de");
JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
return jsonObject.get("data").getAsJsonObject()
.get("translations").getAsJsonArray()
.get(0).getAsJsonObject()
.get("translatedText").getAsString();
Créer un objet Java à partir de JSON
class ApiResponse {
Data data;
class Data {
Translation[] translations;
class Translation {
String translatedText;
}
}
}
...
Gson g = new Gson();
String json =callToTranslateApi("work", "de");
ApiResponse response = g.fromJson(json, ApiResponse.class);
return response.data.translations[0].translatedText;
Vous pouvez utiliser Jayway JsonPath . Ci-dessous, un lien GitHub avec le code source, des détails de pom et une bonne documentation.
https://github.com/jayway/JsonPath
Veuillez suivre les étapes ci-dessous.
Étape 1 : Ajoutez la dépendance du chemin JSON de jayway dans votre chemin de classe à l'aide de Maven ou téléchargez le fichier JAR et ajoutez-le manuellement.
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.2.0</version>
</dependency>
Étape 2 : Veuillez enregistrer votre entrée JSON en tant que fichier pour cet exemple. Dans mon cas, j'ai enregistré votre JSON sous le nom sampleJson.txt. Notez que vous avez manqué une virgule entre pageInfo et posts.
Étape 3 : lisez le contenu JSON du fichier ci-dessus à l'aide de bufferedReader et enregistrez-le sous forme de chaîne.
BufferedReader br = new BufferedReader(new FileReader("D:\\sampleJson.txt"));
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
br.close();
String jsonInput = sb.toString();
Étape 4 : Analysez votre chaîne JSON à l'aide de l'analyseur JSON de jayway.
Object document = Configuration.defaultConfiguration().jsonProvider().parse(jsonInput);
Étape 5 : lisez les détails comme ci-dessous.
String pageName = JsonPath.read(document, "$.pageInfo.pageName");
String pagePic = JsonPath.read(document, "$.pageInfo.pagePic");
String post_id = JsonPath.read(document, "$.posts[0].post_id");
System.out.println("$.pageInfo.pageName " + pageName);
System.out.println("$.pageInfo.pagePic " + pagePic);
System.out.println("$.posts[0].post_id " + post_id);
La sortie sera :
$.pageInfo.pageName = abc
$.pageInfo.pagePic = http://example.com/content.jpg
$.posts[0].post_id = 123456789012_123456789012
j'ai JSON comme ceci:
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
}
}
classe Java
class PageInfo {
private String pageName;
private String pagePic;
// Getters and setters
}
Code permettant de convertir ce JSON en une classe Java.
PageInfo pageInfo = JsonPath.parse(jsonString).read("$.pageInfo", PageInfo.class);
Maven
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.2.0</version>
</dependency>
jsoniter
(jsoniterator) est une bibliothèque json relativement nouvelle et simple, conçue pour être simple et rapide. Tout ce que vous devez faire pour désérialiser les données JSON est
JsonIterator.deserialize(jsonData, int[].class);
où jsonData
est une chaîne de données json.
Consultez le site officiel pour plus d'informations.
Vous pouvez utiliser la bibliothèque d'analyse de flux DSM pour analyser les documents JSON et XML complexes. DSM analyse les données une seule fois et ne charge pas toutes les données en mémoire.
Disons que nous avons la classe Page pour désérialiser les données JSON données.
Classe de page
public class Page {
private String pageName;
private String pageImage;
private List<Sting> postIds;
// getter/setter
}
Créez un fichier de mappage yaml.
result:
type: object # result is array
path: /posts
fields:
pageName:
path: /pageInfo/pageName
pageImage:
path: /pageInfo/pagePic
postIds:
path: post_id
type: array
Utilisez DSM pour extraire des champs.
DSM dsm=new DSMBuilder(new File("path-to-yaml-config.yaml")).create(Page.class);
Page page= (Page)dsm.toObject(new path-to-json-data.json");
page variable sérialisée en json:
{
"pageName" : "abc",
"pageImage" : "http://example.com/content.jpg",
"postIds" : [ "123456789012_123456789012" ]
}
DSM est très bon pour les fichiers json et xml complexes.
On peut utiliser annotation Apache @Model pour créer des classes de modèle Java représentant la structure de JSON et utilisez-les pour accéder à divers éléments de l’arbre JSON. Contrairement aux autres solutions, celle-ci fonctionne complètement sans réflexion et convient donc aux environnements dans lesquels la réflexion est impossible ou entraîne des coûts importants.
Il y a un exemple de projet Maven montrant l'utilisation. Tout d'abord, il définit la structure:
@Model(className="RepositoryInfo", properties = {
@Property(name = "id", type = int.class),
@Property(name = "name", type = String.class),
@Property(name = "owner", type = Owner.class),
@Property(name = "private", type = boolean.class),
})
final class RepositoryCntrl {
@Model(className = "Owner", properties = {
@Property(name = "login", type = String.class)
})
static final class OwnerCntrl {
}
}
il utilise ensuite les classes RepositoryInfo et Owner générées pour analyser le flux d'entrée fourni et récupérer certaines informations tout en procédant de la sorte:
List<RepositoryInfo> repositories = new ArrayList<>();
try (InputStream is = initializeStream(args)) {
Models.parse(CONTEXT, RepositoryInfo.class, is, repositories);
}
System.err.println("there is " + repositories.size() + " repositories");
repositories.stream().filter((repo) -> repo != null).forEach((repo) -> {
System.err.println("repository " + repo.getName() +
" is owned by " + repo.getOwner().getLogin()
);
})
C'est ça! En plus de cela, voici un Gist en direct montrant un exemple similaire avec une communication réseau asynchrone.
Nous pouvons utiliser la classe JSONObject pour convertir une chaîne JSON en objet JSON et effectuer une itération sur l'objet JSON. Utilisez le code suivant.
JSONObject jObj = new JSONObject(contents.trim());
Iterator<?> keys = jObj.keys();
while( keys.hasNext() ) {
String key = (String)keys.next();
if ( jObj.get(key) instanceof JSONObject ) {
System.out.println(jObj.getString(String key));
}
}
Vous pouvez utiliser JsonNode
pour une représentation arborescente de votre chaîne JSON. Cela fait partie de la roche solide jackson bibliothèque qui est omniprésent.
ObjectMapper mapper = new ObjectMapper();
JsonNode yourObj = mapper.readTree("{\"k\":\"v\"}");