2011-10-28 36 views
31

Thư viện nào tốt nhất hiện có để phân tích cú pháp JSON trên Android. Tôi biết khung công tác Android có thư viện JSON được tích hợp sẵn và tôi đã nghe nói về GSON. Nhưng tôi tự hỏi nếu có ai đã so sánh các tùy chọn JSON khác nhau trên Android và đưa ra một lý do để lựa chọn một trong những khác. Tôi đang nghĩ về hiệu suất và khả năng sử dụng như là tiêu chí chính.So sánh hiệu suất và khả năng sử dụng của thư viện JSON Android

+0

Phản hồi tuyệt vời cho đến thời điểm này. Nhưng tôi thực sự muốn nghe thêm về hiệu suất. –

+0

Nếu bạn đang suy nghĩ về hiệu suất, bạn có lẽ cũng nên nghĩ đến việc sử dụng bộ nhớ. Phiên bản tôi đang sử dụng Android JSON không hỗ trợ tokenizing từ đầu đọc/inputstream và ánh xạ tới mô hình dữ liệu do đó sẽ yêu cầu bộ nhớ 2x. – ThomasRS

+0

Trong liên kết "nhiều, nhanh hơn" của tôi là một so sánh hiệu suất khá rộng rãi với thời gian tuần tự hóa, thời gian deserialization và kích thước. Có điều gì ngoài bạn đang tìm kiếm không? – kabuko

Trả lời

39

Trong khi có một số ít các API Java-đến/từ-JSON cung cấp ràng buộc dễ dàng (cơ bản) giữa JSON và cấu trúc dữ liệu Java tùy ý, Jackson và Gson đến nay là phức tạp nhất (có khả năng) và tính năng- tùy chọn phong phú.

Trở lại vào tháng 7 năm 2011, tôi đã đăng một loạt bài viết nhiều phần trên blog của mình so sánh sử dụng Gson so với Jackson, bước qua các tính năng khi chúng được tổ chức trong Hướng dẫn sử dụng Gson, bao gồm các ví dụ về các triển khai có thể so sánh trong Jackson (và triển khai trong Gson, nơi Hướng dẫn sử dụng Gson không đầy đủ hoặc bị hỏng).

Phần thứ sáu của loạt cung cấp liên kết điều hướng dễ dàng để so sánh, cũng như danh sách so sánh tóm tắt. http://programmerbruce.blogspot.com/2011/07/gson-v-jackson-part-6.html

Đây là so sánh toàn diện nhất về việc sử dụng Gson so với Jackson cho các tác vụ JSON-to/from-Java phổ biến được biết đến.

Như đã đề cập, các so sánh hiệu suất của các API Java-đến/từ-JSON khác nhau có sẵn tại https://github.com/eishay/jvm-serializers/wiki. Bản phát hành hiện tại của Gson (2.0) cho thấy chậm hơn 16 lần so với bản phát hành hiện tại của Jackson (1.9.2) tại tuần tự hóa và deserializing cấu trúc JSON 500 byte, sử dụng những nỗ lực thực hiện rất tương đương (chỉ một hoặc hai dòng mã) .

Martin Adamek đăng một số kết quả hoạt động của các API khác nhau chạy trên Android tại http://martinadamek.com/2011/01/31/comparison-of-json-parsers-performance-on-android/http://martinadamek.com/2011/02/04/json-parsers-performance-on-android-with-warmup-and-multiple-iterations/

+2

Đừng quên yếu tố kích thước thư viện. Gson sẽ có khoảng 200kb, trong khi 3 phụ thuộc của Jackson sẽ chạy khoảng 1mb. Với điều kiện bạn không cần hiệu suất rực rỡ, tôi khuyên bạn nên sử dụng Gson để đơn giản và kích thước thư viện. – CorayThan

1

JSON Android rất chức năng nhưng không có chuông. Khi GSON cho phép bạn chỉ định ánh xạ giữa các lớp của bạn và biểu diễn json của chúng. Nó cũng có chuyển đổi tự động rất tốt đẹp của bất kỳ giá trị nguyên thủy để json, không có công việc bổ sung trên một phần của bạn. Tiền thưởng với GSON là nếu bạn có rất nhiều JSON communcaion, hoặc các đối tượng phức tạp yêu cầu kiểm tra giá trị để ngăn chặn các giá trị bất hợp pháp (chẳng hạn như NaN) và các trường hợp khác java-to-JSON là ít hơn thẳng về phía trước.

Nhưng nếu bạn chỉ cần gửi và nhận một đối tượng json đơn giản, thư viện gốc thực hiện thủ thuật khá đáng kính. Tôi đang sử dụng nó trong dự án hiện tại của tôi để đăng điểm số cao lên máy chủ.

3

Vâng đôi khi hiệu suất và khả năng sử dụng có thể mâu thuẫn, nhưng tôi đã tìm thấy GSON để được dễ dàng hơn để sử dụng hơn so với giải pháp thay thế như Jackson, org.json và những người khác. Tôi hiện đang tuần tự hóa dữ liệu JSON có các đối tượng và danh sách 3 hoặc 4 cấp độ sâu. Điều đó đang được nói, tôi đã điều chỉnh JSON của mình để phù hợp hơn cho việc tuần tự hóa, nhưng GSON tổng thể là tuyệt vời.

1

Tôi đang thử nghiệm GSON và đã thử một số cách khác.

GSON thực hiện công việc xuất sắc của các đối tượng phức tạp (chuyển đổi đối tượng thành json) về cơ bản không có thay đổi hoặc suy nghĩ nào về phía bạn, nhưng hơi chậm và bộ nhớ.

Trang web GSON Roadmap cho biết họ mong đợi phiên bản 2.0 sẽ giải quyết một số vấn đề về hiệu suất và sẽ ra mắt vào tháng 10 năm 2011 (sắp kết thúc). Vì vậy, tôi hy vọng họ cung cấp điều đó bởi vì tôi thực sự cần nó.

Các thư viện khác (xin lỗi không thể nhớ tên ngay bây giờ) dường như cũng không tuần tự hóa. Một số chỉ có thể xem xét các biến công khai trong các lớp của bạn hoặc chỉ gọi các phương thức công khai giống như getters/setters. Gson không làm theo cách đó, và sẽ lấy mọi thứ.

Tôi chưa thực hiện nhiều ở bên deserializing (chuyển đổi JSON trở lại đối tượng Java).

+0

Tôi đang so sánh - mua sắm thư viện gson và rất muốn nghe nếu gson 2.0+ cải thiện hiệu suất nhiều. – JimN

+0

@JimN: Có gson 2.0 dường như hoạt động tốt hơn. Trên thực tế có ngay cả một phiên bản mới hơn 2.0 ra tôi nghĩ rằng tôi đã không cố gắng. Tôi đang sử dụng nó khá hiệu quả. Một điều cần lưu ý: Sau khi xuất bản ứng dụng và thử nghiệm của mình, tôi gặp sự cố do Proguard và GSON. – Fraggle

8

GSON thực sự đơn giản để sử dụng và nếu hiệu suất không phải là một vấn đề, nó khá tốt đẹp. Jacksonmuch, much faster mặc dù và không thực sự là nỗ lực nhiều hơn để sử dụng. Như tôi đã nói trong the past trong một câu hỏi SO liên quan khác, tôi đã đạt được hiệu suất rất lớn (khi làm việc với các bộ JSON lớn) bằng cách chuyển sang Jackson từ GSON.

3

Câu trả lời này được nhìn thấy từ góc độ bộ nhớ, vì đó cũng có thể được coi là hiệu suất :-P.

Tôi vừa triển khai phân tích tệp JSON 70KB trong Android, phân tích một mảng đối tượng cần tải từ đầu hoặc cập nhật đối tượng ràng buộc dữ liệu hiện có trước đó, trên HTTP.

Hạn chế lớn nhất với built-in org.json package cho android runtime 3 là

  1. các nhà xây dựng JSONTokener chỉ chấp nhận một String, không đọc
  2. thiếu sự hỗ trợ thiết thực cho kéo phân tích

này thường có nghĩa là bạn cần giữ toàn bộ tệp trong bộ nhớ (nghĩ kích thước byte 2x) và ngoài ra giữ tất cả các đối tượng JSON kết quả trong bộ nhớ cùng một lúc, trước khi bạn bắt đầu thực hiện ràng buộc dữ liệu của mình. Trường hợp xấu nhất là kích thước tệp 2x, đối tượng JSON và đối tượng ràng buộc dữ liệu - thường ít nhất là 2x yêu cầu bộ nhớ.

Nếu bạn kéo phân tích cú pháp từ trình đọc, bạn có thể giảm xuống 1x. Đó là điều quan trọng nhất bạn có thể làm từ quan điểm bộ nhớ. Và ngạc nhiên, nếu bạn đi với một số lớp học hiện đại hơn, như Jackson hoặc chỉ là các nguồn mới nhất từ ​​org.json, bạn sẽ có thể vượt qua cả những khó khăn này mà không gặp vấn đề gì, thời gian chạy Android sau để có một số lớp tiện ích để phân tích cú pháp kéo JSON.

Nếu bạn đang mắc kẹt với một thời gian chạy cũ, và muốn giữ dấu chân của ứng dụng xuống, như tôi đã làm, bạn có thể sao chép JSONTokener từ org.json và sửa đổi vòng phân tích cú pháp cấp cao nhất của bạn (trong trường hợp của tôi là mảng parse loop) và làm dữ liệu ràng buộc trên mỗi thành viên của mảng thay vì toàn bộ mảng cùng một lúc. Bằng cách này bạn sử dụng lại các đối tượng JSON đã có trong thời gian chạy Android càng nhiều càng tốt và vẫn nhận được hiệu ứng trực tuyến (với mức giá thêm id cho từng đối tượng cấp cao nhất).

+0

Tôi thích phản hồi này bởi vì nó giải thích lý do tại sao một cái gì đó giống như một cách tiếp cận tokenizing là nhanh hơn. –

+0

Vâng nếu thời gian trễ quan trọng được tính là thời gian yêu cầu nối mạng được bắt đầu để xử lý phản hồi hoàn tất, quá trình xử lý luồng lý tưởng cho cả XML và JSON và chắc chắn là các định dạng khác. – ThomasRS

1

thử android-async-http

  • Hãy yêu cầu HTTP không đồng bộ, xử lý phản hồi trong callbacks nặc danh
  • HTTP requests xảy ra ngoài thread UI
  • yêu sử dụng một threadpool để hạn sử dụng tài nguyên đồng thời
  • GET/POST công cụ xây dựng params (RequestParams)
  • Tải lên tệp nhiều phần không có thêm thư viện của bên thứ ba
  • Tiny kích thước nguyên cần thiết để ứng dụng của bạn, chỉ 25KB cho tất cả mọi thứ
  • tự động yêu cầu thử lại thông minh tối ưu cho các kết nối di động đốm
  • gzip phản ứng Giải mã hỗ trợ tự động cho các yêu cầu siêu nhanh
  • tập tin nhị phân (hình ảnh vv) tải với BinaryHttpResponseHandler
  • Built-in phản ứng phân tích thành JSON với JsonHttpResponseHandler
  • lưu trữ cookie dai dẳng, tiết kiệm cookie vào SharedPreferences của ứng dụng của bạn

và bạn cũng có thể thử fastjson là bộ xử lý json nhanh.

+0

Xin chào, vui lòng đọc http://stackoverflow.com/questions/how-to-answer đặc biệt là "** Cung cấp ngữ cảnh cho các liên kết **" một phần. –

Các vấn đề liên quan