Jackson vs. Gson [fechado]

363

Depois de pesquisar em algumas bibliotecas existentes por JSON, finalmente acabei com estas duas:

  • Jackson
  • Google GSon

Eu sou um pouco parcial em relação à GSON, mas a palavra na rede é que a GSon sofre de um certo problema de desempenho celestial (em setembro de 2009).

Eu continuo minha comparação; Enquanto isso, estou procurando ajuda para me decidir.

Suraj Chandran
fonte
3
Além disso, para o uso do Android, a última referência de desempenho que eu vi é a seguinte: martinadamek.com/2011/02/04/…
StaxMan
11
Última referência de desempenho CowTalk. - 08 de janeiro de 2011
Iogui
7
Uma observação rápida: quem escolhe o GSon deve usar o 2.1 - seu desempenho é finalmente mensurável melhor que as versões anteriores.
23412 StaxMan
46
Com 74 votos a partir de agora, essa pergunta obviamente tem algumas respostas valiosas. Boas respostas superam perguntas "não construtivas". Votação para reabrir.
22413 Nicholas
11
A documentação de Jackson está ficando ridiculamente complexa agora. . .
dongshengcn 17/09/2013

Respostas:

117

Eu fiz essa pesquisa na última semana e acabei com as mesmas 2 bibliotecas. Como estou usando o Spring 3 (que adota Jackson na visualização Json padrão ' JacksonJsonView '), era mais natural para mim fazer o mesmo. As 2 libs são praticamente as mesmas ... no final, elas simplesmente mapeiam para um arquivo json! :)

De qualquer forma, como você disse, Jackson tem um desempenho positivo e isso é muito importante para mim. O projeto também é bastante ativo, como você pode ver na página deles, e isso também é um sinal muito bom.

mickthompson
fonte
2
Além disso, o Google GSon ainda não oferece referências circulares. Jackson lida com eles?
Guido
11
Suporte a referências circulares ... esse deve ser um recurso primário, mas não tenho certeza se os suporta; nunca encontrei uma referência circular até o momento (mesmo que elas sejam bastante comuns, especialmente no modelo) . Aqui está outra referência que pode destacar a rapidez com que Jackson é comparado com o GSon. Parece 100x mais rápido na serialização / Deserialization code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
mickthompson
11
Jackson não lida com referências circulares atualmente. Se isso é importante, o XStream faz; não tenho certeza se qualquer pacote JSON nativa faz (flex-json talvez?)
StaxMan
11
A partir da versão 1.6, Jackson suporta referências circulares. Consulte Manipular referências bidirecionais usando métodos declarativos para referência.
Ophir Radnitz
Jackson tem mais problemas de segurança, concordando em fortalecer
TuGordoBello
83

Jackson e Gson são os pacotes Java JSON mais completos em relação ao suporte real à ligação de dados; muitos outros pacotes fornecem apenas ligação primitiva de Mapa / Lista (ou modelo de árvore equivalente). Ambos têm suporte completo para tipos genéricos, além de configurabilidade suficiente para muitos casos de uso comuns.

Como eu estou mais familiarizado com Jackson, aqui estão alguns aspectos em que acho que Jackson tem um suporte mais completo que o Gson (desculpas se eu perder um recurso do Gson):

  • Suporte extensivo à anotação; incluindo herança completa e anotações avançadas de "combinação" (associe anotações a uma classe para casos em que você não pode adicioná-las diretamente)
  • Streaming (incremental) de leitura, gravação, para casos de uso com desempenho ultra-alto (ou com memória limitada); pode misturar com ligação de dados (ligar subárvores) - EDIT : as versões mais recentes do Gson também incluem leitor de streaming
  • Modelo de árvore (acesso tipo DOM); pode converter entre vários modelos (árvore <-> objeto java <-> fluxo)
  • Pode usar qualquer construtor (ou método estático de fábrica), não apenas o construtor padrão
  • Acesso a campos e getter / setter (as versões anteriores do gson usavam apenas campos, isso pode ter sido alterado)
  • Suporte JAX-RS pronto para uso
  • Interoperabilidade: também pode usar anotações JAXB, possui suporte / soluções alternativas para pacotes comuns (joda, ibatis, cglib), idiomas da JVM (groovy, clojure, scala)
  • Capacidade de forçar o tratamento de tipo estático (declarado) para saída
  • Suporte para desserialização de tipos polimórficos (Jackson 1.5) - pode serializar E desserializar coisas como List corretamente (com informações de tipo adicionais)
  • Suporte integrado para conteúdo binário (base64 de / para JSON Strings)
StaxMan
fonte
6
Na verdade, este post - cowtowncoder.com/blog/archives/2010/11/entry_434.html - resume muitos dos recursos de Jackson que não são encontrados em outros pacotes.
precisa saber é o seguinte
12
Eu consideraria não exigir que as anotações sejam um recurso do GSON, não uma deficiência (que você listou pelo menos três vezes acima).
orbfish
6
Nem Jackson nem Gson exigem o uso de anotações. Mas ter anotações como opção é um recurso valioso na minha opinião (especialmente "anotações de combinação", que é uma opção de processamento adicional para permitir a associação de configurações externas).
precisa saber é
3
O Gson permite que você registre um InstanceCreator para especificar uma maneira alternativa de construir uma instância, em vez de usar um construtor padrão.
inder
37

O Gson 1.6 agora inclui uma API de streaming de baixo nível e um novo analisador que é realmente mais rápido que Jackson.

inder
fonte
Eu estaria interessado em ver uma medida que apóie isso. Pelo menos as medidas em: wiki.fasterxml.com/JacksonInFiveMinutes ainda indicam que o GSON não é competitivo com outros pacotes Java json.
precisa saber é o seguinte
11
Temos micro-benchmarks disponíveis (verificados no repositório Gson subversion no diretório trunk / metrics) que mostram que, em simples conversões de objetos, a API de streaming de baixo nível pode ser até 10 vezes mais rápida. Também existem outros parâmetros de referência (que eu preciso incentivar o autor original a publicar) que essa API de baixo nível atualmente supera outras bibliotecas, incluindo Jackson. No entanto, a criação de benchmarks abrangentes e representativos levará algum tempo e esforço.
Inder
3
Mais um ponto de dados: o jvm-serializers ( github.com/eishay/jvm-serializers ) agora possui o teste "gson / manual", que usa a API de streaming GSON como alternativa à ligação de dados. Depois que o autor executa os números 'oficiais', o wiki pode ser atualizado. Mas, ao executar isso localmente, acho que não suporta declarações de ser super rápido.
StaxMan
12
(Além de acima: números oficiais foram incluídos - streaming de Gson é mais rápido do que a ligação de dados, mas não até o nível de desempenho Jackson)
StaxMan
9
... para quem acompanha, o Gson 2.1 acabou apresentando melhorias significativas e mensuráveis ​​no desempenho.
StaxMan
13

Adicionando a outras respostas já fornecidas acima. Se a insensibilidade do caso for de alguma importância para você, use Jackson. O Gson não suporta distinção entre maiúsculas e minúsculas para nomes de chave, enquanto jackson suporta.

Aqui estão dois links relacionados

(Não) Suporte à diferenciação de maiúsculas e minúsculas no Gson: GSON: Como obter um elemento que não diferencia maiúsculas de minúsculas do Json?

Suporte à sensibilidade a casos em Jackson https://gist.github.com/electrum/1260489

Snegi
fonte
O trecho de suporte à distinção entre maiúsculas e minúsculas em Jackson não funciona . Ou melhor, funciona apenas para propriedades de nível superior. Tente aninhar uma propriedade e você verá que sua solução não funciona.
Andres F.
11
Na verdade, há suporte formal para propriedades que não diferenciam maiúsculas de minúsculas MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, adicionadas no Jackson 2.5. Portanto, não há necessidade de adicionar código personalizado para isso.
precisa saber é o seguinte
6

Parece que o GSon não suporta JAXB. Usando a classe anotada JAXB para criar ou processar a mensagem JSON, eu posso compartilhar a mesma classe para criar a interface Restful Web Service usando o Spring MVC.

raymond.mh.ng
fonte
Se você já possui anotações em suas classes de dados para o Hibernate, não deseja outro conjunto para JAXB.
orbfish
11
É bom poder adicionar suporte para anotações "estrangeiras". Jackson possui o módulo opcional de anotação JAXB, bem como o módulo Hibernate para algumas de suas anotações (para transitoriedade, carregamento lento). Talvez o Gson possa ser estendido para permitir extensões modulares também.
StaxMan
2
Especialmente porque JAXB é um padrão!
maxxyme