JSON (Javascript Object Notation) est une collection de paires clé-valeur qui peuvent être facilement analysées et générées par des applications. C’est un sous-ensemble de la norme de langage de programmation JavaScript ECMA-262. L’analyse de JSON est nécessaire dans la plupart des applications, telles que les API RESTful ou les applications nécessitant une sérialisation des données.
Dans l’écosystème Java, les deux bibliothèques les plus populaires pour la manipulation des données JSON sont Jackson et Gson. Les deux sont largement utilisés et offrent des avantages uniques. Cet article utilise des exemples de cas limites pour explorer les fonctionnalités des deux bibliothèques sur différents paramètres.
Vue d’ensemble de Jackson et Gson
Jackson
Jackson a été développé par FasterXML et est utilisé dans des applications et des frameworks d’entreprise tels que Spring Boot. Il offre l’analyse, la sérialisation et la désérialisation des données JSON. Les fonctionnalités suivantes rendent cette bibliothèque populaire parmi les développeurs :
- Jackson est la bibliothèque de traitement JSON par défaut dans Spring Boot, ce qui élimine la configuration manuelle dans la plupart des cas.
- Il facilite la désérialisation JSON en types génériques en utilisant TypeReference ou JavaType.
- Il fournit différentes annotations pour personnaliser le comportement de la sérialisation et de la désérialisation. Par exemple,
@JsonProperty(name)
rend la correspondance entre la clé entrante et le champ Java POJO réel transparente. - Il offre un support étendu et robuste pour la liaison de données bidirectionnelle (JSON vers POJO et vice versa), l’API de streaming (l’API lit le JSON dans POJO) et l’analyse du modèle arborescent (une carte en mémoire des objets JSON).
- La bibliothèque Jackson offre des performances élevées grâce à la minimisation de la surcharge mémoire et l’optimisation de la sérialisation/désérialisation (du JSON vers POJO et vice versa).
- Jackson prend en charge des modules supplémentaires tels que le traitement XML, YAML et les améliorations spécifiques à Kotlin, Scala.
- Les annotations telles que
@JsonTypeInfo
et@JsonSubTypes
gèrent les types polymorphes. - Il gère les champs manquants ou supplémentaires dans les données JSON en raison de sa compatibilité ascendante et descendante.
- Jackson prend en charge les objets immuables et les classes avec des constructeurs, y compris ceux utilisant des motifs de construction.
- La classe
ObjectMapper
est thread-safe et permet donc une utilisation efficace dans les applications multithreadées.
Gson
Gson a été développé par Google et conçu pour convertir le JSON en objets Java (POJO) et vice versa. Il est simple et idéal pour les petites applications nécessitant des mises en œuvre rapides. Cette bibliothèque open-source offre les fonctionnalités clés suivantes:
- Gson a des dépendances externes minimales; il est donc facile à intégrer.
- Il prend en charge les objets imbriqués et les types de données complexes tels que les listes, les maps et les classes personnalisées.
- Il peut désérialiser du JSON en collections génériques comme
List<T>
,Map<K,V>
en utilisant TypeToken. - Les interfaces JsonSerializer et JsonDeserializer de la bibliothèque Gson permettent une implémentation personnalisée.
- Les valeurs nulles sont exclues par défaut dans la sortie JSON, et si nécessaire, les valeurs nulles peuvent être incluses dans la sortie.
- Les annotations
@SerializedName
associent les clés JSON aux champs Java avec des noms différents. - Les objets Gson sont thread-safe et peuvent donc être utilisés dans des applications multi-thread.
- La classe GsonBuilder peut appliquer des politiques de nommage personnalisées pour les champs. Par exemple,
FieldNamingPolicy.IDENTITY
est la politique par défaut, ce qui signifie que le nom du champ reste inchangé.
Cas particuliers pris en compte dans cette comparaison
Feature | Jackson | GSON |
---|---|---|
Champs supplémentaires |
Ignorés par défaut, configurables. |
Ignorés par défaut. |
Valeurs nulles |
Prise en charge de @JsonInclude. |
Requiert .serializeNulls(). |
Références circulaires |
Pris en charge en utilisant @JsonIdentityInfo. |
Non pris en charge directement. |
Gestion des données |
Prend en charge l’API de date Java 8 avec des modules. |
Requiert des adaptateurs de type personnalisés. |
Polymorphisme |
Intégré avec @JsonTypeInfo. |
Nécessite une logique de désérialisation personnalisée. |
Le JSON d’entrée considéré pour la comparaison avec les bibliothèques Jackson et Gson est présent sur GitHub.
La représentation de la classe modèle du JSON se trouve sur GitHub.
Implémentation Jackson
Le JSON ci-dessus est converti en un objet Java en utilisant les bibliothèques Jackson ci-dessous :
<!-- Jackson START-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.18.2</version>
</dependency>
<!-- Jackson END-->
Classe de parsing JSON principale en utilisant la bibliothèque Jackson :
public class JacksonJsonMain {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
//Jackson Support for LocalDate using jackson-datatype-jsr310
mapper.registerModule(new JavaTimeModule());
//Configuration to ignore extra fields
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// Deserialize the JSON
EmployeeModelData employeeModelData = mapper.readValue(json, EmployeeModelData.class);
Employee employee=employeeModelData.getEmployee();
// display Json fields
System.out.println("Jackson Library parsing output");
System.out.println("Employee Name: " + employee.getName());
System.out.println("Department Name: " + employee.getDepartment().getName());
System.out.println("Skills: " + employee.getSkills());
System.out.println("Team Members Count: " + employeeModelData.getTeamMembers().size());
}
}
La sortie de la classe ci-dessus est la suivante :
Implémentation Gson
La dépendance Gson utilisée pour convertir le JSON ci-dessus en un objet Java est la suivante :
<!--GSON START -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
<!--GSON END -->
Parcours JSON en utilisant la bibliothèque GSON principale :
public class GsonJsonMain {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(LocalDate.class, new LocalDateAdapter()) // Register LocalDate adapter
.serializeNulls() // Handle null values
.setPrettyPrinting() // Pretty print JSON
.create();
// Deserialize the JSON
EmployeeModelData data = gson.fromJson(json, EmployeeModelData.class);
// Print Employee information
System.out.println("GSON Library parsing output");
System.out.println("Employee Name: " + data.getEmployee().getName());
System.out.println("Department Name: " + data.getEmployee().getDepartment().getName());
System.out.println("Skills: " + data.getEmployee().getSkills());
System.out.println("Team Members Count: " + data.getTeamMembers().size());
}
}
La sortie de la classe principale ci-dessus est la suivante :
Lequel Devrais-je Choisir ?
Jackson offre de hautes performances ; par conséquent, il doit être utilisé lorsque les projets impliquent des structures de données complexes ou de grands ensembles de données, tandis que Gson doit être utilisé lorsque les ensembles de données sont plus petits et que la structure de données est simple.
Conclusion
Les deux bibliothèques peuvent gérer efficacement l’ensemble de données ci-dessus et sont excellentes pour le traitement du parsing JSON en JAVA. La comparaison mentionnée ci-dessus aide à choisir la bonne bibliothèque en fonction des exigences du projet.
Les extraits de code mentionnés ci-dessus sont disponibles dans le dépôt GitHub.
Une comparaison détaillée entre Jackson et Gson est disponible sur Baeldung. La documentation officielle de Jackson offre des informations approfondies sur les fonctionnalités et la configuration de Jackson. De même, la documentation officielle de Gson fournit un guide d’implémentation détaillé.
Source:
https://dzone.com/articles/jackson-vs-gson-edge-cases-json-parsing-java