Jackson vs Gson: Casi limite nel parsing JSON per le app Java

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:

  1. Jackson è la libreria di elaborazione JSON predefinita in Spring Boot, il che elimina la configurazione manuale nella maggior parte dei casi.
  2. Facilita la deserializzazione JSON in tipi generici utilizzando TypeReference o JavaType.
  3. 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.
  4. 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).
  5. 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).
  6. Jackson supporta moduli aggiuntivi come l’elaborazione di XML, YAML e miglioramenti specifici per Kotlin e Scala.
  7. Annotazioni come @JsonTypeInfo e @JsonSubTypes gestiscono tipi polimorfici.
  8. Gestisce campi mancanti o aggiuntivi nei dati JSON grazie alla sua compatibilità retroattiva e avanzata.
  9. Jackson fornisce supporto per oggetti immutabili e classi con costruttori, inclusi quelli che utilizzano pattern di builder.
  10. 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:

  1. Gson ha dipendenze esterne minime; pertanto, è facile da integrare.
  2. Supporta oggetti nidificati e tipi di dati complessi come liste, mappe e classi personalizzate.
  3. Può deserializzare JSON in collezioni generiche come List<T>, Map<K,V> utilizzando TypeToken.
  4. Le interfacce JsonSerializer e JsonDeserializer della libreria Gson consentono implementazioni personalizzate.
  5. I valori nulli sono esclusi dall’output JSON per impostazione predefinita e, se necessario, i valori nulli possono essere inclusi nell’output.
  6. Le annotazioni @SerializedName mappano le chiavi JSON ai campi Java con nomi diversi.
  7. Gli oggetti Gson sono thread-safe e, pertanto, possono essere utilizzati in applicazioni multithread.
  8. 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:

XML

 

Classe main di parsing JSON usando la libreria Jackson:

Java

 

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:

XML

 

Parsing JSON usando la libreria GSON classe main:

Java

 

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