Jackson vs. Gson [zamknięty]

363

Po przeszukaniu niektórych istniejących bibliotek JSON, w końcu skończyłem z tymi dwoma:

  • Jackson
  • Google GSon

Jestem trochę stronniczy w stosunku do GSON, ale w sieci słychać, że GSon cierpi na pewien problem z wydajnością na niebie (od września 2009).

Kontynuuję moje porównanie; w międzyczasie szukam pomocy w podjęciu decyzji.

Suraj Chandran
źródło
3
Ponadto, w przypadku Androida, najnowszy test wydajności, jaki widziałem, to: martinadamek.com/2011/02/04/…
StaxMan
1
Najnowszy test wydajności CowTalk. - 08 stycznia 2011 r.
Iogui
7
Jedna szybka uwaga: każdy, kto wybierze GSon, powinien upewnić się, że używa 2.1 - jego wydajność jest wreszcie wymiernie lepsza niż we wcześniejszych wersjach.
StaxMan,
46
Przy 74 głosach na poparcie to pytanie oczywiście zawiera cenne odpowiedzi. Dobre odpowiedzi przebijają „mało konstruktywne” pytania. Głosowanie w celu ponownego otwarcia.
Nicholas
1
Dokumentacja Jacksona staje się teraz absurdalnie skomplikowana. . .
dongshengcn,

Odpowiedzi:

117

Zrobiłem to badanie w zeszłym tygodniu i skończyłem z tymi samymi 2 bibliotekami. Kiedy używam Spring 3 (który przyjmuje Jacksona w domyślnym widoku Jsona „ JacksonJsonView ”), bardziej naturalne było dla mnie to samo. 2 lib są prawie takie same ... na końcu po prostu mapują do pliku json! :)

W każdym razie, jak powiedziałeś, Jackson ma wydajność + i jest to dla mnie bardzo ważne. Projekt jest również dość aktywny, co widać na ich stronie internetowej, co również jest bardzo dobrym znakiem.

mickthompson
źródło
2
Ponadto Google GSon nie obsługuje jeszcze okólników. Czy Jackson sobie z nimi radzi?
Guido
1
Obsługa odwołań cyklicznych ... to powinna być podstawowa funkcja, ale nie jestem pewien, czy je obsługuje, do tej pory nigdy nie spotkałem się z odwołaniami cyklicznymi (nawet jeśli powinny być dość powszechne, szczególnie w modelu) . Oto kolejny punkt odniesienia, który może podkreślić, jak szybki jest Jackson w porównaniu z GSonem. Wygląda 100 razy szybciej w serializacji / deserializacji code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
mickthompson
1
Jackson nie obsługuje obecnie okrągłych odniesień. Jeśli jest to ważne, XStream robi; nie jestem pewien, czy ma to jakiś natywny pakiet json (być może Flex-
Json
11
Od wersji 1.6 Jackson obsługuje odwołania cykliczne. Zobacz Obsługa odniesień dwukierunkowych za pomocą deklaratywnych metod odniesienia.
Ophir Radnitz
Jackson ma więcej problemów z bezpieczeństwem, w tym fortuny
TuGordoBello,
83

Jackson i Gson są najbardziej kompletnymi pakietami Java JSON pod względem faktycznej obsługi wiązania danych; wiele innych pakietów zapewnia tylko prymitywne wiązanie Map / List (lub równoważny model drzewa). Oba mają pełną obsługę typów ogólnych, a także wystarczającą konfigurowalność dla wielu typowych przypadków użycia.

Ponieważ jestem bardziej zaznajomiony z Jacksonem, oto niektóre aspekty, w których myślę, że Jackson ma pełniejsze wsparcie niż Gson (przepraszam, jeśli przegapię funkcję Gsona):

  • Rozbudowana obsługa adnotacji; w tym pełne dziedziczenie i zaawansowane adnotacje typu „mix-in” (powiązanie adnotacji z klasą w przypadkach, w których nie można ich bezpośrednio dodać)
  • Przesyłanie strumieniowe (przyrostowe) odczytów, zapisów, do zastosowań o bardzo wysokiej wydajności (lub ograniczonej pamięci); można łączyć z wiązaniem danych (powiązać poddrzewa) - EDYCJA : najnowsze wersje Gson obejmują również czytnik strumieniowy
  • Model drzewa (dostęp podobny do DOM); może konwertować między różnymi modelami (drzewo <-> obiekt Java <-> strumień)
  • Może używać dowolnych konstruktorów (lub statycznych metod fabrycznych), a nie tylko domyślnego konstruktora
  • Dostęp do pola i gettera / settera (wcześniejsze wersje gson używały tylko pól, to mogło się zmienić)
  • Gotowa obsługa JAX-RS
  • Interoperacyjność: może również używać adnotacji JAXB, ma obsługę / obejścia dla popularnych pakietów (joda, ibatis, cglib), języków JVM (groovy, clojure, scala)
  • Możliwość wymuszenia obsługi typu statycznego (deklarowanego) dla danych wyjściowych
  • Obsługa deserializacji typów polimorficznych (Jackson 1.5) - może poprawnie serializować ORAZ deserializować takie rzeczy jak Lista (z dodatkowymi informacjami o typie)
  • Zintegrowana obsługa treści binarnych (base64 do / z JSON Strings)
StaxMan
źródło
6
W rzeczywistości ten post - cowtowncoder.com/blog/archives/2010/11/entry_434.html - podsumowuje wiele funkcji Jacksona, których nie ma w innych pakietach.
StaxMan
12
Uważam, że nie wymaganie adnotacji jest cechą GSON, a nie brakiem (który wymieniłeś co najmniej 3 razy powyżej).
orbfish
6
Ani Jackson, ani Gson nie wymagają użycia adnotacji. Ale posiadanie adnotacji jako opcji jest cenną funkcją w mojej opinii (szczególnie „mieszanie adnotacji”, która jest dodatkową opcją przetwarzania umożliwiającą powiązanie konfiguracji zewnętrznej).
StaxMan
3
Gson pozwala zarejestrować InstanceCreator, aby określić alternatywny sposób konstruowania instancji zamiast korzystania z domyślnego konstruktora.
dniu
37

Gson 1.6 zawiera teraz niskopoziomowy interfejs API do przesyłania strumieniowego i nowy analizator składni, który jest w rzeczywistości szybszy niż Jackson.

inder
źródło
Byłbym zainteresowany widzeniem pomiaru, który to potwierdza. Przynajmniej pomiary na: wiki.fasterxml.com/JacksonInFiveMinutes nadal wskazują, że GSON nie jest konkurencyjny w stosunku do innych pakietów Java Json.
StaxMan
1
Dostępne są mikro-testy porównawcze (sprawdzone w repozytorium subwersji Gson w katalogu trunk / metrics), które pokazują, że przy prostych konwersjach obiektów interfejs API przesyłania strumieniowego niskiego poziomu może być nawet 10-krotnie szybszy. Istnieją również inne testy porównawcze (które muszę zachęcić oryginalnego autora do opublikowania), że ten interfejs API niskiego poziomu jest obecnie lepszy niż inne biblioteki, w tym Jackson. Jednak stworzenie kompleksowych i reprezentatywnych testów porównawczych zajmie trochę czasu i wysiłku.
inder
3
Jeszcze jeden punkt danych: jvm-serializers ( github.com/eishay/jvm-serializers ) ma teraz test „gson / manual”, który wykorzystuje interfejs strumieniowy GSON jako alternatywę dla wiązania danych. Gdy autor uruchomi „oficjalne” numery, wiki można zaktualizować. Ale po uruchomieniu tego lokalnie nie sądzę, aby wspierało to stwierdzenie, że jest super szybki.
StaxMan
12
(oprócz powyższych: uwzględniono oficjalne liczby - przesyłanie strumieniowe Gson jest szybsze niż wiązanie danych, ale nie do poziomu wydajności Jacksona)
StaxMan
9
... dla każdego, kto przejdzie później, Gson 2.1 ostatecznie wymyślił znaczące i mierzalne ulepszenia wydajności.
StaxMan
13

Dodanie do innych odpowiedzi już podanych powyżej. Jeśli nie ma znaczenia, czy nie ma znaczenia wielkość liter, skorzystaj z Jackson. Gson nie obsługuje rozróżniania wielkości liter w nazwach kluczy, podczas gdy Jackson.

Oto dwa powiązane linki

(Nie) Obsługa rozróżniania wielkości liter w Gson: GSON: Jak uzyskać element Json bez rozróżniania wielkości liter?

Obsługa rozróżniania wielkości liter w Jackson https://gist.github.com/electrum/1260489

snegi
źródło
Fragment obsługujący rozróżnianie wielkości liter w Jacksonie nie działa . A raczej działa tylko w przypadku właściwości najwyższego poziomu. Spróbuj zagnieździć właściwość, a zobaczysz, że Twoje rozwiązanie nie działa.
Andres F.,
1
W rzeczywistości istnieje formalne wsparcie dla właściwości bez rozróżniania wielkości liter MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, dodane w Jackson 2.5. Nie trzeba więc dodawać do tego niestandardowego kodu.
StaxMan
6

Wygląda na to, że GSon nie obsługuje JAXB. Używając klasy z adnotacjami JAXB do tworzenia lub przetwarzania komunikatu JSON, mogę współużytkować tę samą klasę, aby utworzyć interfejs usługi Restful Web Service przy użyciu sprężynowego MVC.

raymond.mh.ng
źródło
Jeśli masz już adnotacje do swoich klas danych dla Hibernacji, i tak nie chcesz mieć innego zestawu dla JAXB.
orbfish
1
Miło jest móc dodać obsługę „obcych” adnotacji. Jackson ma opcjonalny moduł adnotacji JAXB, a także moduł Hibernacji dla kilku swoich adnotacji (dla przejściowości, leniwego ładowania). Być może Gson mógłby zostać rozszerzony, aby umożliwić również rozszerzenia modułowe.
StaxMan
2
Zwłaszcza, że ​​JAXB jest standardem!
maxxyme