Jackson vs. Gson [chiuso]


363

Dopo aver cercato JSON in alcune librerie esistenti, ho finalmente finito con questi due:

  • Jackson
  • Google GSon

Sono un po 'parziale nei confronti di GSON, ma la parola sulla rete è che GSon soffre di un certo problema di prestazioni celesti (al settembre 2009).

Sto continuando il mio confronto; nel frattempo cerco aiuto per decidermi.


3
Inoltre, per l'utilizzo di Android, l'ultimo benchmark delle prestazioni che ho visto è questo: martinadamek.com/2011/02/04/...
StaxMan


7
Una breve nota: chiunque scelga GSon dovrebbe assicurarsi di utilizzare la 2.1: le sue prestazioni sono finalmente decisamente migliori rispetto alle versioni precedenti.
StaxMan,

46
Con 74 voti positivi, questa domanda ha ovviamente delle risposte preziose. Le buone risposte superano domande "non costruttive". Votazione per riaprire.
Nicholas

1
La documentazione di Jackson sta diventando incredibilmente complessa ora. . .
dongshengcn

Risposte:


117

Ho fatto questa ricerca la scorsa settimana e ho finito con le stesse 2 librerie. Dato che sto usando Spring 3 (che adotta Jackson nella sua visualizzazione Json predefinita " JacksonJsonView "), è stato più naturale per me fare lo stesso. Le 2 librerie sono praticamente le stesse ... alla fine sono semplicemente associate a un file json! :)

Comunque, come hai detto, Jackson ha un + in termini di prestazioni ed è molto importante per me. Il progetto è anche abbastanza attivo come puoi vedere dalla loro pagina web e anche questo è un ottimo segno.


2
Inoltre, Google GSon non supporta ancora i riferimenti circolari. Jackson li gestisce?
Guido

1
Supporto per riferimenti circolari ... che dovrebbe essere una caratteristica principale ma non sono sicuro che li supporti, finora non ho mai trovato un riferimento circolare (anche se dovrebbero essere abbastanza comuni, soprattutto nel modello) . Ecco un altro punto di riferimento che può evidenziare la velocità di Jackson rispetto a GSon. Sembra 100 volte più veloce in serializzazione /
deserializzazione

1
Jackson non gestisce attualmente riferimenti circolari. Se questo è importante, XStream lo fa; non sono sicuro che ci sia un pacchetto nativo json (forse flex-json?)
StaxMan

11
A partire dalla versione 1.6, Jackson supporta riferimenti circolari. Vedere Gestire i riferimenti bidirezionali utilizzando metodi dichiarativi per riferimento.
Ophir Radnitz,

Jackson ha più problemi di sicurezza, accodandosi per fortificare
TuGordoBello

83

Jackson e Gson sono i pacchetti Java JSON più completi per quanto riguarda il supporto dell'associazione dati effettiva; molti altri pacchetti forniscono solo il legame primitivo di Mappa / Elenco (o modello di albero equivalente). Entrambi hanno anche il supporto completo per tipi generici, nonché una sufficiente configurabilità per molti casi d'uso comuni.

Dato che ho più familiarità con Jackson, ecco alcuni aspetti in cui penso che Jackson abbia un supporto più completo di Gson (mi scuso se mi manca una funzione Gson):

  • Ampio supporto per le annotazioni; inclusa l'ereditarietà completa e le annotazioni "mix-in" avanzate (associare le annotazioni a una classe per i casi in cui non è possibile aggiungerle direttamente)
  • Streaming (incrementale) di lettura, scrittura, per casi d'uso ad altissime prestazioni (o memoria limitata); può mescolarsi con l'associazione dei dati (legare sotto-alberi) - EDIT : le ultime versioni di Gson includono anche il lettore di streaming
  • Modello ad albero (accesso simile a DOM); può convertire tra vari modelli (albero <-> java object <-> stream)
  • Può usare qualsiasi costruttore (o metodo statico di fabbrica), non solo costruttore predefinito
  • Accesso a campo e getter / setter (le versioni precedenti di gson utilizzavano solo campi, questo potrebbe essere cambiato)
  • Supporto JAX-RS predefinito
  • Interoperabilità: può anche usare le annotazioni JAXB, ha supporto / soluzioni per pacchetti comuni (joda, ibatis, cglib), lingue JVM (groovy, clojure, scala)
  • Capacità di forzare la gestione del tipo statico (dichiarato) per l'output
  • Supporto per la deserializzazione di tipi polimorfici (Jackson 1.5) - può serializzare E deserializzare cose come Elenco correttamente (con informazioni aggiuntive sul tipo)
  • Supporto integrato per contenuti binari (da base64 a / da stringhe JSON)

6
In realtà, questo post - cowtowncoder.com/blog/archives/2010/11/entry_434.html - riassume molte delle funzionalità di Jackson che non si trovano in altri pacchetti.
StaxMan

12
Considererei che non è necessario che le annotazioni siano una caratteristica di GSON, non un difetto (che hai elencato almeno 3 volte sopra).
orbfish

6
Né Jackson né Gson richiedono l'uso di annotazioni. Ma avere annotazioni come opzione è una caratteristica preziosa a mio avviso (in particolare "annotazioni miste" che è un'opzione di elaborazione aggiuntiva che consente di associare la configurazione esterna).
StaxMan

3
Gson ti consente di registrare un InstanceCreator per specificare un modo alternativo per costruire un'istanza invece di usare un costruttore predefinito.
inder

37

Gson 1.6 ora include un'API di streaming di basso livello e un nuovo parser che è in realtà più veloce di Jackson.


Sarei interessato a vedere una misura che lo supporta. Almeno le misurazioni su: wiki.fasterxml.com/JacksonInFiveMinutes indicano ancora che GSON non è competitivo con altri pacchetti json Java.
StaxMan,

1
Sono disponibili micro-benchmark (controllati nel repository di sovversione Gson nella directory trunk / metrics) che mostrano che nelle conversioni di oggetti semplici, l'API di streaming di basso livello potrebbe essere fino a 10 volte più veloce. Esistono anche altri parametri di riferimento (che devo incoraggiare l'autore originale a pubblicare) che questa API di basso livello attualmente batte altre librerie, incluso Jackson. Tuttavia, la creazione di parametri di riferimento completi e rappresentativi richiederà tempo e impegno.
inder

3
Un altro punto dati: jvm-serializers ( github.com/eishay/jvm-serializers ) ora ha il test "gson / manual" che usa l'ASM streaming GSON come alternativa all'associazione dei dati. Una volta che l'autore esegue numeri "ufficiali", la wiki può essere aggiornata. Ma eseguendolo localmente, non credo che supporti le affermazioni di essere super veloce.
StaxMan,

12
(Oltre a quanto sopra: sono stati inclusi i numeri ufficiali - lo streaming di Gson è più veloce del databinding, ma non fino al livello di prestazioni di Jackson)
StaxMan

9
... per tutti i follow-up, alla fine Gson 2.1 ha prodotto miglioramenti significativi e misurabili delle prestazioni.
StaxMan

13

Aggiungendo ad altre risposte già fornite sopra. Se la distinzione tra maiuscole e minuscole è di qualche importanza per te, usa Jackson. Gson non supporta la distinzione tra maiuscole e minuscole per i nomi delle chiavi, mentre lo fa jackson.

Ecco due link correlati

(No) Supporto della distinzione tra maiuscole e minuscole in Gson: GSON: Come ottenere un elemento insensibile alle maiuscole da Json?

Supporto della distinzione tra maiuscole e minuscole in Jackson https://gist.github.com/electrum/1260489


Lo snippet per il supporto della distinzione tra maiuscole e minuscole a Jackson non funziona . O meglio, funziona solo per proprietà di alto livello. Prova a nidificare una proprietà e vedrai che la tua soluzione non funziona.
Andres F.

1
In realtà esiste un supporto formale per le proprietà senza distinzione tra maiuscole e minuscole MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, aggiunto in Jackson 2.5. Quindi non è necessario aggiungere un codice personalizzato per questo.
StaxMan

6

Sembra che GSon non supporti JAXB. Utilizzando la classe annotata JAXB per creare o elaborare il messaggio JSON, posso condividere la stessa classe per creare l'interfaccia Restful Web Service utilizzando Spring MVC.


Se hai già annotazioni sulle tue classi di dati per Hibernate, non vuoi comunque un altro set per JAXB.
orbfish

1
È bello poter aggiungere il supporto per le annotazioni "straniere". Jackson ha un modulo di annotazione JAXB opzionale, oltre al modulo Hibernate per un paio delle sue annotazioni (per transitori, caricamento lento). Forse Gson potrebbe essere esteso per consentire anche estensioni modulari.
StaxMan

2
Tanto più che JAXB è uno standard!
maxxyme
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.