Je vais résumer les méthodes de JSON → Java, Java → JSON qui sont souvent utilisées lors de l'utilisation de l'API Web en Java En outre, comment HTTP POST et HTTP GET JSON sera résumé dans le prochain article.
[Cet article] Je vais résumer comment gérer JSON en Java </ b>
Il existe deux façons de convertir JSON en Java (désérialiser) et Java en JSON (sérialiser).
Comment utiliser GSON pour la bibliothèque
Comment utiliser Jackson pour la bibliothèque
Je vais expliquer deux façons d'effectuer une communication HTTP avec Java.
Comment utiliser OkHttp3
Comment utiliser le package standard Java ** HttpUrlConnection **
Considérez le cours le plus court lorsque la chaîne de caractères JSON que vous souhaitez analyser existe déjà, par exemple lorsque vous accédez à une API externe. Puisque la classe de modèle ** Site généré automatiquement ** est utilisée, c'est OK s'il y a une chaîne de caractères JSON (le schéma JSON est encore meilleur).
Exemple de chaîne JSON: exemple.json
{
"person": {
"firstName": "John",
"lastName": "Doe",
"address": "NewYork",
"pets": [
{"type": "Dog", "name": "Jolly"},
{"type": "Cat", "name": "Grizabella"},
{"type": "Fish", "name": "Nimo"}
]
}
}
Quand il s'agit d'opérations JSON en Java, j'utilise souvent deux bibliothèques, ** GSON ** et ** Jackson **. Je ne peux pas dire lequel est le meilleur, alors je vais vous expliquer les deux.
GSON [Bibliothèque] créée par Google (https://github.com/google/gson)
Jackson [Bibliothèque] axée sur les performances (https://github.com/FasterXML/jackson)
Commençons par GSON. Si vous souhaitez créer un analyseur Java à partir de chaînes JSON brutes, il est facile d'utiliser jsonschema2pojo, je vais donc l'essayer.
Cliquez ici pour le code source de ce chapitre https://github.com/riversun/java-json-gson-jackson-http/tree/master/src/main/java/com/example/gson
La méthode de spécification de la bibliothèque GSON est la suivante
■ La dernière bibliothèque de GSON (référentiel maven) https://mvnrepository.com/artifact/com.google.code.gson/gson
■ Exemple de réglage GSON ** maven **
pom.xml
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
■ Exemple de réglage GSON ** gradle **
build.gradle
compile 'com.google.code.gson:gson:2.8.5'
Accédez au site suivant et collez le JSON ci-dessus http://www.jsonschema2pojo.org/
■ Définissez comme suit sur le site et appuyez sur ** Zip ** pour générer automatiquement une classe de modèle
Package: ** com.example.gson ** (nom du package, peu importe, mais la source est automatiquement générée avec ce nom de package) Nom de la classeN: ** Modèle ** (nom de classe supérieure de Pojo) Target language:Java Type de source: ** JSON ** (classe de modèle d'estimation à partir de la chaîne JSON elle-même) Style d'annotation: ** Gson ** (utilisez GSON pour l'analyseur) ☑ ** Autoriser des propriétés supplémentaires ** (JSON peut être mélangé avec des propriétés inconnues)
Un fichier ** Zip ** est généré, donc lorsque vous le téléchargez et l'ouvrez, trois fichiers java sont automatiquement générés comme indiqué ci-dessous.
■ ** Model.java ** ・ ・ ・ Classe la plus élevée
Model.java
package com.example.gson;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Model {
@SerializedName("person")
@Expose
public Person person;
}
■ ** Person.java ** ・ ・ ・ ** "pets": [] ** qui est spécifié comme un tableau devient ** List **
Person.java
package com.example.gson;
import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Person {
@SerializedName("firstName")
@Expose
public String firstName;
@SerializedName("lastName")
@Expose
public String lastName;
@SerializedName("address")
@Expose
public String address;
@SerializedName("pets")
@Expose
public List<Pet> pets = null;
}
■ Pet.java
Pet.java
package com.example.gson;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Pet {
@SerializedName("type")
@Expose
public String type;
@SerializedName("name")
@Expose
public String name;
}
Convertir de JSON en Java, c'est-à-dire charger une chaîne JSON dans une classe de modèle Java à l'aide de GSON Le code clé est le suivant
Gson gson = new Gson();
Model model = gson.fromJson(json, Model.class);
Le code entier ressemble à ceci
■ GsonJson2Java.java
GsonJson2.java
package com.example.gson;
import com.google.gson.Gson;
public class GsonJson2Java {
public static void main(String[] args) {
String json =
"{" +
" \"person\": {" +
" \"firstName\": \"John\"," +
" \"lastName\": \"Doe\"," +
" \"address\": \"NewYork\"," +
" \"pets\": [" +
" {\"type\": \"Dog\", \"name\": \"Jolly\"}," +
" {\"type\": \"Cat\", \"name\": \"Grizabella\"}," +
" {\"type\": \"Fish\", \"name\": \"Nimo\"}" +
" ]" +
" }" +
"}";
Gson gson = new Gson();
Model model = gson.fromJson(json, Model.class);
System.out.println("firstName:" + model.person.firstName);
System.out.println("lastName:" + model.person.lastName);
System.out.println("address:" + model.person.address);
System.out.println("1st pet:" + model.person.pets.get(0).name);
}
}
Résultat d'exécution
firstName:John
lastName:Doe
address:NewYork
1st pet:Jolly
Maintenant, faisons JSON à partir de Java. Convertissez la classe de modèle Java (POJO) en JSON.
Gson gson = new Gson();
String json = gson.toJson(model);
GsonJava2Json.java
GsonJava2Json.java
package com.example.gson;
import java.util.ArrayList;
import com.google.gson.Gson;
public class GsonJava2Json {
public static void main(String[] args) {
Model model = new Model();
model.person = new Person();
model.person.firstName = "John";
model.person.lastName = "Faire";
model.person.address = "New York";
model.person.pets = new ArrayList<Pet>();
Pet pet1 = new Pet();
pet1.type = "chien";
pet1.name = "Gai";
model.person.pets.add(pet1);
Pet pet2 = new Pet();
pet2.type = "Chat";
pet2.name = "Grizabella";
model.person.pets.add(pet2);
Pet pet3 = new Pet();
pet3.type = "poisson";
pet3.name = "Nimo";
model.person.pets.add(pet3);
Gson gson = new Gson();
String json = gson.toJson(model);
System.out.println(json);
}
}
Lorsque cela a été exécuté, JSON pouvait être sorti de la classe de modèle comme suit.
Résultat d'exécution
{"person":{"firstName":"John","lastName":"Faire","address":"New York","pets":[{"type":"chien","name":"Gai"},{"type":"Chat","name":"Grizabella"},{"type":"poisson","name":"Nimo"}]}}
Si vous faites cela, le JSON sera indenté et bien formaté et sortira.
Gson gson2 = new GsonBuilder().setPrettyPrinting().create();
String prettyJson = gson2.toJson(model);
System.out.println(prettyJson);
Résultat d'exécution
{
"person": {
"firstName": "John",
"lastName": "Faire",
"address": "New York",
"pets": [
{
"type": "chien",
"name": "Gai"
},
{
"type": "Chat",
"name": "Grizabella"
},
{
"type": "poisson",
"name": "Nimo"
}
]
}
}
Jackson a des séries 1.x et 2.x, mais utilise des séries 2.x
Cliquez ici pour le code source de ce chapitre https://github.com/riversun/java-json-gson-jackson-http/tree/master/src/main/java/com/example/jackson
La méthode de spécification de la bibliothèque de Jackson est la suivante
■ La dernière bibliothèque de Jackson (référentiel maven) https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
■ Exemple de réglage ** maven ** de Jackson
pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
■ Exemple de réglage ** gradle ** de Jackson
build.gradle
compile 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
Accédez au site suivant et collez le JSON ci-dessus http://www.jsonschema2pojo.org/
■ Définissez comme suit sur le site et appuyez sur ** Zip ** pour générer automatiquement une classe de modèle
Package: ** com.example. jackson </ font> ** (nom du package, peu importe, mais la source est automatiquement générée avec ce nom de package) Nom de la classeN: ** Modèle ** (nom de classe supérieure de Pojo) Target language:Java Type de source: ** JSON ** (classe de modèle d'estimation à partir de la chaîne JSON elle-même) Style d'annotation: ** jackson 2.x ** </ font> (utilisez Jackson 2.x comme analyseur) ☑ ** Autoriser des propriétés supplémentaires ** (JSON peut être mélangé avec des propriétés inconnues)
Un fichier ** Zip ** est généré, donc lorsque vous le téléchargez et l'ouvrez, trois fichiers java sont automatiquement générés comme indiqué ci-dessous.
■ ** Modèle .java ** ・ ・ ・ La classe la plus élevée. Il est caractéristique que ** @JsonAnyGetter ** accepte des propriétés supplémentaires. Aussi, pour cette raison, il devient plus redondant que GSON.
Model.java
package com.example.jackson;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"person"
})
public class Model {
@JsonProperty("person")
public Person person;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
■ ** Person.java ** ・ ・ ・ ** @JsonPropertyOrder ** peut être utilisé pour contraindre l'ordre d'apparition. Un tableau spécifié comme ** "pets": [] ** devient ** List **.
Person.java
package com.example.jackson;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"firstName",
"lastName",
"address",
"pets"
})
public class Person {
@JsonProperty("firstName")
public String firstName;
@JsonProperty("lastName")
public String lastName;
@JsonProperty("address")
public String address;
@JsonProperty("pets")
public List<Pet> pets = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
■ Pet.java
Pet.java
package com.example.jackson;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"type",
"name"
})
public class Pet {
@JsonProperty("type")
public String type;
@JsonProperty("name")
public String name;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
Convertir de JSON en Java, c'est-à-dire utiliser Jackson pour charger une chaîne JSON dans une classe de modèle Java Le code clé est le suivant
ObjectMapper mapper = new ObjectMapper();
Model model = mapper.readValue(json, Model.class);
Le code entier ressemble à ceci
■ JacksonJson2Java.java
JacksonJson2Java.java
package com.example.jackson;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonJson2Java {
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
String json = "{" +
" \"person\": {" +
" \"firstName\": \"John\"," +
" \"lastName\": \"Doe\"," +
" \"address\": \"NewYork\"," +
" \"pets\": [" +
" {\"type\": \"Dog\", \"name\": \"Jolly\"}," +
" {\"type\": \"Cat\", \"name\": \"Grizabella\"}," +
" {\"type\": \"Fish\", \"name\": \"Nimo\"}" +
" ]" +
" }" +
"}";
ObjectMapper mapper = new ObjectMapper();
Model model = mapper.readValue(json, Model.class);
System.out.println("firstName:" + model.person.firstName);
System.out.println("lastName:" + model.person.lastName);
System.out.println("address:" + model.person.address);
System.out.println("1st pet:" + model.person.pets.get(0).name);
}
}
Maintenant, faisons JSON à partir de Java. Convertissez la classe de modèle Java (POJO) en JSON.
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(model);
JacksonJava2Json.java
JacksonJava2Json.java
package com.example.jackson;
import java.util.ArrayList;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonJava2Json {
public static void main(String[] args) throws JsonProcessingException {
Model model = new Model();
model.person = new Person();
model.person.firstName = "John";
model.person.lastName = "Faire";
model.person.address = "New York";
model.person.pets = new ArrayList<Pet>();
Pet pet1 = new Pet();
pet1.type = "chien";
pet1.name = "Gai";
model.person.pets.add(pet1);
Pet pet2 = new Pet();
pet2.type = "Chat";
pet2.name = "Grizabella";
model.person.pets.add(pet2);
Pet pet3 = new Pet();
pet3.type = "poisson";
pet3.name = "Nimo";
model.person.pets.add(pet3);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(model);
System.out.println(json);
}
}
Lorsque cela a été exécuté, JSON pouvait être sorti de la classe de modèle comme suit.
Résultat d'exécution
{"person":{"firstName":"John","lastName":"Faire","address":"New York","pets":[{"type":"chien","name":"Gai"},{"type":"Chat","name":"Grizabella"},{"type":"poisson","name":"Nimo"}]}}
Si vous faites cela, le JSON sera indenté et bien formaté et sortira.
ObjectMapper mapper2 = new ObjectMapper();
String prettyJson = mapper2.writerWithDefaultPrettyPrinter().writeValueAsString(model);
System.out.println(prettyJson);
Résultat d'exécution
{
"person" : {
"firstName" : "John",
"lastName" : "Faire",
"address" : "New York",
"pets" : [ {
"type" : "chien",
"name" : "Gai"
}, {
"type" : "Chat",
"name" : "Grizabella"
}, {
"type" : "poisson",
"name" : "Nimo"
} ]
}
}
J'ai expliqué comment exécuter facilement JSON → Java et Java → JSON en utilisant GSON.
Le code source utilisant GSON est ici
J'ai expliqué la même chose pour Jackson.
Le code source utilisant Jackson est ici
La méthode de POST et GET JSON via la communication HTTP est résumée dans ici.
Recommended Posts