JSON (Notazione Oggetti Javascript) è una collezione di coppie chiave-valore che possono essere facilmente analizzate e generate dalle applicazioni. È un sottoinsieme dello standard del linguaggio di programmazione JavaScript ECMA-262. L’analisi del JSON è necessaria nella maggior parte delle applicazioni, come le API RESTful o le applicazioni che necessitano di serializzazione dei dati.
Nel ecosistema Java, le due librerie più popolari per gestire dati JSON sono Jackson e Gson. Entrambe sono ampiamente utilizzate e offrono vantaggi unici. Questo articolo utilizza esempi di casi limite per esplorare le caratteristiche di entrambe le librerie su diversi parametri.
Panoramica di Jackson e Gson
Jackson
Jackson è stato sviluppato da FasterXML ed è utilizzato in applicazioni e framework aziendali come Spring Boot. Offre analisi, serializzazione e deserializzazione dei dati JSON. Le seguenti caratteristiche rendono questa libreria popolare tra gli sviluppatori:
- Jackson è la libreria di elaborazione JSON predefinita in Spring Boot, il che elimina la configurazione manuale nella maggior parte dei casi.
- Facilita la deserializzazione JSON in tipi generici utilizzando TypeReference o JavaType.
- Fornisce diverse annotazioni per personalizzare il comportamento di serializzazione e deserializzazione. Ad esempio,
@JsonProperty(name)
rende fluido il mapping tra la chiave in arrivo e il campo POJO Java effettivo. - Fornisce un supporto esteso e robusto per il Databinding bidirezionale (JSON a POJO e viceversa), API di streaming (l’API legge JSON in POJO) e parsing del modello ad albero (una mappa in memoria di oggetti JSON).
- La libreria Jackson offre elevate prestazioni grazie alla minimizzazione dell’overhead di memoria e all’ottimizzazione della serializzazione/deserializzazione (da JSON a POJO e viceversa).
- Jackson supporta moduli aggiuntivi come l’elaborazione di XML, YAML e miglioramenti specifici per Kotlin e Scala.
- Annotazioni come
@JsonTypeInfo
e@JsonSubTypes
gestiscono tipi polimorfici. - Gestisce campi mancanti o aggiuntivi nei dati JSON grazie alla sua compatibilità retroattiva e avanzata.
- Jackson fornisce supporto per oggetti immutabili e classi con costruttori, inclusi quelli che utilizzano pattern di builder.
- La classe
ObjectMapper
è thread-safe e, quindi, consente un uso efficiente in applicazioni multithread.
Gson
Gson è stato sviluppato da Google ed è progettato per convertire JSON in oggetti Java (POJO) e viceversa. È semplice e ideale per applicazioni più piccole che necessitano di implementazioni rapide. La libreria open-source offre le seguenti funzionalità chiave:
- Gson ha dipendenze esterne minime; pertanto, è facile da integrare.
- Supporta oggetti nidificati e tipi di dati complessi come liste, mappe e classi personalizzate.
- Può deserializzare JSON in collezioni generiche come
List<T>
,Map<K,V>
utilizzando TypeToken. - Le interfacce JsonSerializer e JsonDeserializer della libreria Gson consentono implementazioni personalizzate.
- I valori nulli sono esclusi dall’output JSON per impostazione predefinita e, se necessario, i valori nulli possono essere inclusi nell’output.
- Le annotazioni
@SerializedName
mappano le chiavi JSON ai campi Java con nomi diversi. - Gli oggetti Gson sono thread-safe e, pertanto, possono essere utilizzati in applicazioni multithread.
- La classe GsonBuilder può applicare politiche di denominazione personalizzate per i campi. Ad esempio,
FieldNamingPolicy.IDENTITY
è la politica predefinita, il che significa che il nome del campo rimane invariato.
Casi limite considerati in questo confronto
Feature | Jackson | GSON |
---|---|---|
Campi extra |
Ignorato per impostazione predefinita, configurabile. |
Ignorato per impostazione predefinita. |
Valori nulli |
Supporta @JsonInclude. |
Richiede .serializeNulls(). |
Riferimenti Circolari |
Supportato usando @JsonIdentityInfo. |
Non supportato direttamente. |
Gestione dei Dati |
Supporta l’API Date di Java 8 con moduli. |
Richiede adattatori di tipo personalizzato. |
Polimorfismo |
Integrato con @JsonTypeInfo. |
Necessita di logica di deserializzazione personalizzata. |
Il JSON di input considerato per il confronto con le librerie Jackson e Gson è presente su GitHub.
La rappresentazione della classe modello del JSON è su GitHub.
Implementazione di Jackson
Il JSON sopra è convertito in un oggetto Java utilizzando le librerie Jackson qui sotto:
<!-- 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 main di parsing JSON usando la libreria 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());
}
}
L’output della classe sopra è il seguente:
Implementazione di Gson
La dipendenza Gson utilizzata per convertire il JSON sopra in un oggetto Java è qui sotto:
<!--GSON START -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
<!--GSON END -->
Parsing JSON usando la libreria GSON classe main:
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());
}
}
L’output della classe principale sopra è il seguente:
Quale dovrei scegliere?
Jackson offre alte prestazioni; quindi, deve essere utilizzato quando i progetti coinvolgono strutture dati complesse o grandi set di dati, mentre Gson deve essere utilizzato quando ci sono set di dati più piccoli e la struttura dei dati è semplice.
Conclusione
Entrambe le librerie possono gestire efficacemente il dataset sopra menzionato e sono eccellenti nel processamento del parsing JSON in JAVA. Il confronto sopra citato aiuta a scegliere la libreria giusta in base ai requisiti del progetto.
I frammenti di codice menzionati sopra sono disponibili nel repository GitHub.
Un confronto dettagliato tra Jackson e Gson è disponibile su Baeldung. La documentazione ufficiale di Jackson offre informazioni approfondite sulle caratteristiche e la configurazione di Jackson. Allo stesso modo, la documentazione ufficiale di Gson fornisce una guida dettagliata all’implementazione.
Source:
https://dzone.com/articles/jackson-vs-gson-edge-cases-json-parsing-java