Jackson Vs. Gson [đóng cửa]


363

Sau khi tìm kiếm thông qua một số thư viện hiện có cho JSON, cuối cùng tôi đã kết thúc với hai thư viện này:

  • Jackson
  • Google GSon

Tôi là một phần của GSON, nhưng trên mạng là GSon bị một vấn đề hiệu suất thiên thể nhất định (kể từ tháng 9 năm 2009).

Tôi đang tiếp tục so sánh của tôi; Trong khi đó, tôi đang tìm kiếm sự giúp đỡ để quyết định.


3
Ngoài ra, đối với việc sử dụng Android, điểm chuẩn hiệu suất mới nhất tôi đã thấy là: martinadamek.com/2011/02/04/iêu
StaxMan


7
Một lưu ý nhanh: bất kỳ ai chọn GSon nên đảm bảo sử dụng 2.1 - hiệu suất của nó cuối cùng tốt hơn so với các phiên bản trước.
StaxMan

46
Với 74 phiếu bầu cho đến nay, câu hỏi này rõ ràng có một số câu trả lời có giá trị. Câu trả lời hay át chủ bài "không mang tính xây dựng". Bỏ phiếu để mở lại.
Nicholas

1
Tài liệu của Jackson hiện đang trở nên phức tạp một cách lố bịch. . .
dongshengcn

Câu trả lời:


117

Tôi đã thực hiện nghiên cứu này vào tuần trước và tôi đã kết thúc với cùng 2 thư viện. Khi tôi đang sử dụng Spring 3 (áp dụng Jackson trong chế độ xem Json mặc định của nó ' JacksonJsonView '), tôi sẽ làm điều tương tự hơn. 2 lib khá giống nhau ... cuối cùng, chúng chỉ đơn giản là ánh xạ tới một tệp json! :)

Dù sao như bạn đã nói Jackson có hiệu suất + và điều đó rất quan trọng đối với tôi. Dự án cũng khá tích cực như bạn có thể thấy từ trang web của họ và đó cũng là một dấu hiệu rất tốt.


2
Ngoài ra, Google GSon chưa hỗ trợ tài liệu tham khảo thông tư. Jackson có xử lý chúng không?
Guido

1
Hỗ trợ Tham chiếu Thông tư ... đó phải là một tính năng chính nhưng tôi không chắc là nó có hỗ trợ chúng hay không, tôi chưa bao giờ gặp phải một tham chiếu vòng tròn (ngay cả khi chúng khá phổ biến, đặc biệt là trong mô hình) . Đây là một điểm chuẩn khác có thể làm nổi bật Jackson nhanh như thế nào nếu so với GSon. Có vẻ 100x nhanh hơn trong serialization / Deserialization code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
mickthompson

1
Jackson hiện không xử lý các tài liệu tham khảo thông tư. Nếu đó là điều quan trọng, XStream sẽ làm; không chắc chắn nếu có gói json bản địa nào (flex-json có lẽ?)
StaxMan

11
Kể từ phiên bản 1.6, Jackson không hỗ trợ các tham chiếu vòng tròn. Xem Xử lý các tham chiếu hai chiều bằng các phương thức khai báo để tham khảo.
Ophir Radnitz

Jackson có nhiều vấn đề bảo mật hơn, tích lũy để củng cố
TuGordoBello

83

Jackson và Gson là các gói Java JSON hoàn chỉnh nhất liên quan đến hỗ trợ liên kết dữ liệu thực tế; nhiều gói khác chỉ cung cấp ràng buộc Bản đồ / Danh sách (hoặc mô hình cây tương đương) nguyên thủy. Cả hai đều có hỗ trợ đầy đủ cho các loại chung, cũng như đủ cấu hình cho nhiều trường hợp sử dụng phổ biến.

Vì tôi quen thuộc hơn với Jackson, đây là một số khía cạnh mà tôi nghĩ Jackson có sự hỗ trợ đầy đủ hơn Gson (xin lỗi nếu tôi bỏ lỡ tính năng Gson):

  • Hỗ trợ chú thích mở rộng; bao gồm thừa kế đầy đủ và các chú thích "hỗn hợp" nâng cao (chú thích liên kết với một lớp cho các trường hợp bạn không thể trực tiếp thêm chúng)
  • Truyền phát (tăng dần) đọc, viết, cho các trường hợp sử dụng hiệu suất cực cao (hoặc giới hạn bộ nhớ); có thể trộn với liên kết dữ liệu (liên kết cây con) - EDIT : phiên bản mới nhất của Gson cũng bao gồm trình đọc phát trực tuyến
  • Mô hình cây (truy cập giống như DOM); có thể chuyển đổi giữa các mô hình khác nhau (cây <-> đối tượng java <-> luồng)
  • Có thể sử dụng bất kỳ hàm tạo nào (hoặc các phương thức tĩnh của nhà máy), không chỉ là hàm tạo mặc định
  • Truy cập trường và getter / setter (các phiên bản gson trước đó chỉ sử dụng các trường, điều này có thể đã thay đổi)
  • Hỗ trợ JAX-RS vượt trội
  • Khả năng tương tác: cũng có thể sử dụng các chú thích JAXB, có hỗ trợ / giải quyết công việc cho các gói chung (joda, ibatis, cglib), các ngôn ngữ JVM (Groovy, clojure, scala)
  • Khả năng buộc xử lý kiểu tĩnh (khai báo) cho đầu ra
  • Hỗ trợ khử tuần hoàn các loại đa hình (Jackson 1.5) - có thể tuần tự hóa và giải tuần tự hóa những thứ như Danh sách chính xác (có thêm thông tin loại)
  • Hỗ trợ tích hợp cho nội dung nhị phân (base64 đến / từ Chuỗi JSON)

6
Trên thực tế, bài đăng này - cowtowncoder.com/blog/archives/2010/11/entry_434.html - tóm tắt nhiều tính năng của Jackson không có trong các gói khác.
StaxMan

12
Tôi sẽ xem xét không yêu cầu chú thích là một tính năng của GSON, không phải là một thiếu sót (mà bạn đã liệt kê ít nhất 3 lần ở trên).
orbfish

6
Cả Jackson và Gson đều không yêu cầu sử dụng chú thích. Nhưng có chú thích làm tùy chọn là một tính năng có giá trị trong quan điểm của tôi (đặc biệt là "chú thích hỗn hợp" là tùy chọn xử lý bổ sung để cho phép liên kết cấu hình bên ngoài).
Staxman

3
Gson cho phép bạn đăng ký InstanceCreator để chỉ định một cách khác để xây dựng một thể hiện thay vì sử dụng một hàm tạo mặc định.
ấn định

37

Gson 1.6 hiện bao gồm API phát trực tuyến cấp thấp và trình phân tích cú pháp mới thực sự nhanh hơn Jackson.


Tôi sẽ quan tâm đến việc xem một phép đo hỗ trợ này. Ít nhất các phép đo tại: wiki.fasterxml.com/JacksonInFiveMinutes vẫn chỉ ra rằng GSON không cạnh tranh với các gói json Java khác.
Staxman

1
Chúng tôi có sẵn các điểm chuẩn vi mô (được kiểm tra trong kho lưu trữ phụ của Gson trong thư mục trung kế / số liệu) cho thấy rằng trên các chuyển đổi đối tượng đơn giản, API phát trực tuyến cấp thấp có thể nhanh hơn gấp 10 lần. Cũng có những điểm chuẩn khác (mà tôi cần khuyến khích tác giả ban đầu xuất bản) rằng API cấp thấp này hiện đang đánh bại các thư viện khác bao gồm Jackson. Tuy nhiên, việc tạo điểm chuẩn toàn diện và đại diện sẽ mất một thời gian và công sức.
ấn định

3
Thêm một điểm dữ liệu: jvm-serialators ( github.com/eishay/jvm-serialulators ) hiện có thử nghiệm "gson / thủ công" sử dụng api streaming GSON thay thế cho liên kết dữ liệu. Khi tác giả chạy số 'chính thức', wiki có thể được cập nhật. Nhưng từ việc chạy cái này cục bộ, tôi không nghĩ nó hỗ trợ các tuyên bố là siêu nhanh.
StaxMan

12
(ngoài ở trên: đã bao gồm các số chính thức - phát trực tuyến Gson nhanh hơn so với cơ sở dữ liệu, nhưng không đạt đến mức hiệu suất của Jackson)
StaxMan

9
... Đối với bất kỳ ai theo dõi, Gson 2.1 cuối cùng đã đưa ra những cải tiến hiệu suất đáng kể và có thể đo lường được.
StaxMan

13

Thêm vào các câu trả lời khác đã được đưa ra ở trên. Nếu trường hợp không nhạy cảm là quan trọng đối với bạn, thì hãy sử dụng Jackson. Gson không hỗ trợ tính không nhạy cảm cho các tên chính, trong khi jackson thì không.

Đây là hai liên kết liên quan

(Không) Hỗ trợ độ nhạy trường hợp trong Gson: GSON: Làm thế nào để có được yếu tố không nhạy cảm trường hợp từ Json?

Hỗ trợ độ nhạy trường hợp trong Jackson https://gist.github.com/electrum/1260361


Đoạn trích hỗ trợ phân biệt chữ hoa chữ thường trong Jackson không hoạt động . Hay đúng hơn, nó chỉ hoạt động cho các thuộc tính cấp cao nhất. Hãy thử lồng một thuộc tính và bạn sẽ thấy giải pháp của mình không hoạt động.
Andres F.

1
Trên thực tế, có hỗ trợ chính thức cho các thuộc tính không phân biệt chữ hoa chữ thường MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, được thêm vào trong Jackson 2.5. Vì vậy, không cần thêm mã tùy chỉnh cho điều đó.
StaxMan

6

Có vẻ như GSon không hỗ trợ JAXB. Bằng cách sử dụng lớp chú thích JAXB để tạo hoặc xử lý thông báo JSON, tôi có thể chia sẻ cùng một lớp để tạo giao diện Dịch vụ Web Restful bằng cách sử dụng spring MVC.


Nếu bạn đã có chú thích trên các lớp dữ liệu của mình cho Hibernate, bạn không muốn có một bộ khác cho JAXB.
orbfish

1
Thật tuyệt khi có thể thêm hỗ trợ cho các chú thích "nước ngoài". Jackson có mô-đun chú thích JAXB tùy chọn, cũng như mô-đun Hibernate cho một số chú thích của nó (để chuyển tải, lười tải). Có lẽ Gson cũng có thể được mở rộng để cho phép mở rộng mô-đun.
Staxman 17/03/2016

2
Đặc biệt là JAXB là một tiêu chuẩn!
maxxyme
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.