2010-03-04 22 views
307

Po przeszukaniu przez niektórych istniejących bibliotek dla JSON, mam wreszcie skończył z tymi dwoma:Jackson vs. Gson

  • Jackson
  • Google GSon

Jestem nieco częściowe kierunku GSON, ale słowo na Sieć polega na tym, że GSon cierpi na pewien niebiański występ issue (stan na wrzesień 2009).

Kontynuuję porównanie; w międzyczasie szukam pomocy, aby podjąć decyzję.

+3

także do użytku z systemem Android, najnowsze testów wydajności widziałem jest to: http://www.martinadamek.com/2011/02/04/json-parsers-performance-on-android-with-warmup-and-multiple-iterations/ – StaxMan

+1

[Najnowszy test porównawczy CowTalk.] (http: //www.cowtowncoder.com/blog/archives/2011/01/entry_438 .html # links) - styczeń, 08, 2011 – Iogui

+7

Jedna krótka uwaga: każdy wybierający GSon powinien upewnić się, że używa 2.1 - jego działanie jest w końcu znacznie lepsze niż wcześniejsze wersje. – StaxMan

Odpowiedz

98

Zrobiłem te badania w zeszłym tygodniu i skończyłem z tymi samymi 2 bibliotekami. Ponieważ używam Spring 3 (który przyjmuje Jacksona w domyślnym widoku Json'a "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 to dla mnie bardzo ważne. Projekt jest również bardzo aktywny, jak widać z their web page i to również bardzo dobry znak.

+2

Ponadto Google GSon nie wspiera jeszcze odniesień kołowych. Czy Jackson je obsługuje? –

+0

Obsługa referencji okrągłych ... to powinna być podstawowa cecha, ale nie jestem pewna, czy je obsługuje, nigdy dotąd nie spotkałem się z okólnikiem (nawet jeśli powinny one być dość popularne, jak sądzę, zwłaszcza w modelu). Oto kolejny wzorzec, który może podkreślić, jak szybki jest Jackson w porównaniu z GSonem. Wygląda 100 razy szybciej w Serializacji/Deserializacji http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking – mickthompson

+1

Jackson obecnie nie obsługuje odwołań cyklicznych. Jeśli to ważne, XStream to robi; nie jestem pewien, czy działa jakaś natywna paczka json (flex-json być może?) – StaxMan

77

Jackson i Gson to najbardziej kompletne pakiety Java JSON dotyczące rzeczywistej obsługi powiązania danych; wiele innych pakietów zapewnia jedynie prymitywne powiązanie Map/List (lub równoważnego drzewa modelu). Oba mają kompletne wsparcie dla typów ogólnych, a także wystarczającą konfigurowalność dla wielu typowych przypadków użycia.

Ponieważ jestem bardziej zaznajomieni z Jacksonem, oto kilka aspektów, w których myślę Jackson ma pełniejsze wsparcie niż Gson (przeprosiny jeśli tęsknię funkcję Gson):

  • Rozbudowane wsparcie adnotacji; w tym pełne dziedziczenie i zaawansowane adnotacje typu "mix-in" (skojarzone adnotacje z klasą dla przypadków, w których nie można ich bezpośrednio dodać).
  • Przesyłanie strumieniowe (przyrostowe) odczytywanie, zapisywanie, w celu uzyskania wyjątkowo wysokiej wydajności (lub ograniczonej pamięci) przypadków użycia; można mieszać z powiązaniem danych (bind sub-trees) - EDIT: najnowsze wersje Gson zawierają także czytnik strumieniowy
  • Model drzewa (dostęp DOM-podobny); może konwertować pomiędzy różnymi modelami (tree < -> obiekt Java < -> stream)
  • można używać żadnych konstruktorów (lub statycznych metod fabrycznych), a nie tylko domyślny konstruktor
  • Pole i getter/setter dostępu (wcześniejsze wersje gson stosowane tylko Pola, można to zmienić)
  • Out-of-box JAX-RS wspierać
  • interoperacyjność: można również użyć adnotacji JAXB ma support/obejścia typowych opakowań (Joda, iBatis, cglib), języki JVM (groovy, clojure, scala)
  • Możliwość wymuszenia obsługi statycznej (zadeklarowanej) dla wyjścia
  • Wsparcie dla deserializacji typów polimorficznych (Jackson 1,5) - można szeregować I deserializowania rzeczy jak listy prawidłowo (z dodatkowymi informacjami typu)
  • zintegrowane wsparcie dla treści binarnym (base64 do/od JSON Strings)
+6

W rzeczywistości ten post - http://www.cowtowncoder.com/blog/archives/2010/11/entry_434.html - podsumowuje wiele funkcji Jacksona, których nie ma w innych pakietach. – StaxMan

+8

Uważam, że nie wymagam, aby adnotacje były cechą GSON, a nie braków (które wymieniłeś co najmniej 3 razy powyżej). – orbfish

+3

Ani Jackson, ani Gson nie wymagają użycia adnotacji. Ale posiadanie adnotacji jako opcji jest cenną cechą mojej opinii (szczególnie "adnotacje typu" mix-in ", która jest dodatkową opcją przetwarzania umożliwiającą powiązanie konfiguracji zewnętrznej). – StaxMan

33

Gson 1.6 zawiera teraz API do przesyłania strumieniowego niskiego poziomu i nowy parser, który jest rzeczywiście szybszy niż Jackson.

+0

Byłbym zainteresowany widząc pomiar, który z powrotem to. Przynajmniej pomiary na stronie: http://wiki.fasterxml.com/JacksonInFiveMinutes nadal wskazują, że GSON nie jest konkurencyjny w stosunku do innych pakietów json Java. – StaxMan

+1

Mamy dostępne mikro-benchmarki (zaznaczone w repozytorium subversion Gson w katalogu trunk/metryka), które pokazują, że przy prostych konwersjach obiektowych API strumieniowania niskiego poziomu może być do 10 razy szybsze. Są też inne testy porównawcze (które muszę zachęcić autora do publikacji), że ten niski poziom API obecnie bije inne biblioteki, w tym Jackson. Jednak stworzenie kompleksowych i reprezentatywnych benchmarków zajmie trochę czasu i wysiłku. – inder

+3

Kolejny punkt danych: jvm-serializers (https://github.com/eishay/jvm-serializers) ma teraz test "gson/manual", który wykorzystuje API strumieniowania GSON jako alternatywę dla powiązania danych. Gdy autor uruchomi "oficjalne" numery, wiki może zostać zaktualizowane. Ale od uruchomienia tego na miejscu, nie sądzę, że obsługuje stwierdzenia, że ​​jest super szybki. – StaxMan

5

Wygląda na to, że GSon nie obsługuje JAXB. Używając klasy adnotowanej JAXB do utworzenia lub przetworzenia komunikatu JSON, mogę udostępnić tę samą klasę, aby utworzyć interfejs Restful Web Service przy użyciu Spring MVC.

+0

Jeśli masz już adnotacje na swoich klasach danych dla Hibernate, i tak nie chcesz innego zestawu dla JAXB. – orbfish

+1

Miło jest móc dodawać obsługę "obcych" adnotacji. Jackson ma opcjonalny moduł adnotacji JAXB, a także moduł Hibernuj dla kilku swoich adnotacji (do przejściowego, leniwego ładowania). Może Gson mógłby zostać rozszerzony, aby umożliwić modułowe rozszerzenia również. – StaxMan

+1

Zwłaszcza, że ​​JAXB jest standardem! – maxxyme

10

Dodanie do innych odpowiedzi już podanych powyżej. Jeśli nieuwzględnienie wielkości liter jest dla ciebie ważne, użyj Jackson. Gson nie obsługuje rozróżniania wielkości liter dla nazw klawiszy, podczas gdy jackson ma.

Oto dwa powiązane linki

(Nie) Case wsparcie czułość w Gson: GSON: How to get a case insensitive element from Json?

Case wsparcie wrażliwość w Jackson https://gist.github.com/electrum/1260489

+0

Obsługa urywków dla wielkości liter w Jackson ** nie działa **. Lub raczej działa tylko dla właściwości najwyższego poziomu. Spróbuj zagnieździć obiekt, a zobaczysz, że Twoje rozwiązanie nie działa. –

+0

W rzeczywistości istnieje formalne wsparcie dla właściwości niewrażliwych na wielkość liter, 'MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES', dodane w Jackson 2.5. Więc nie ma potrzeby dodawania do tego niestandardowego kodu. – StaxMan