2010-03-18 20 views
15

Tôi đang sử dụng khá nhiều việc phân tích cú pháp JSON trong một ứng dụng tôi đang viết. Hầu hết những gì tôi đã thực hiện đã được triển khai bằng cách sử dụng thư viện JSONObject được tích hợp sẵn của Android (có phải là json-lib không?).JSON: Trình phân tích luồng của Jackson - có thực sự đáng giá không?

JSONObject dường như tạo ra các phiên bản hoàn toàn mọi thứ trong chuỗi JSON ... ngay cả khi tôi không kết thúc bằng cách sử dụng tất cả chúng.

Ứng dụng của tôi hiện hoạt động khá tốt, ngay cả trên G1.

Câu hỏi của tôi là: tốc độ và bộ nhớ có được lợi ích từ việc sử dụng trình phân tích cú pháp luồng như Jackson đáng giá không?

By rắc rối, tôi muốn nói điều này: Theo như tôi có thể nói, có ba nhược điểm để sử dụng Jackson thay vì xây dựng trong thư viện:

  1. Sự phụ thuộc vào một thư viện bên ngoài. Điều này làm cho .apk của bạn lớn hơn cuối cùng. Không phải là một vấn đề lớn.
  2. Ứng dụng của bạn dễ vỡ hơn. Vì việc phân tích cú pháp không được thực hiện tự động, nó dễ bị tổn thương hơn với các thay đổi trong văn bản JSON mà nó phân tích cú pháp (có lẽ tôi sai về điều này).
  3. Viết mã để phân tích cú pháp JSON thông qua trình phân tích luồng là xấu và tẻ nhạt.
+1

Tôi không đồng ý với # 2. Nếu cấu trúc JSON thay đổi một cách bất ngờ, bạn thực sự không may mắn. –

+0

Không đúng trong một số trường hợp nhất định .. ví dụ, thêm một đối tượng làm giá trị trong đối tượng khác. Trừ khi bạn lên kế hoạch cho nó trong trình phân tích cú pháp kéo, nó sẽ ném nó đi, trong khi với JSONObject, nó sẽ hoạt động. Ví dụ: Thay đổi { "first_name": "Adam", "last_name": "Olsen" } để { "first_name": "Adam, " last_name: "Olsen", "phone_numbers": { "nhà riêng": "555-867-5309", "cơ quan": "888-555-5555" } } Sẽ ném trình phân tích cú pháp kéo của bạn ra trong vòng lặp như: while (parser .nextToken()! = JsonToken.END_OBJECT) - Bạn sẽ kết thúc đánh sớm END_OBJECT, nơi JSONObject sẽ phân tích cú pháp của nó. – synic

+0

Có thể viết trình phân tích cú pháp luồng để đối phó với điều đó. Tôi tin rằng đây là những gì shipChildren (http://jackson.codehaus.org/1.5.0/javadoc/org/codehaus/jackson/JsonParser.html#skipChildren%28%29) là dành cho. –

Trả lời

2

Đoán bạn đã trả lời khá nhiều câu hỏi của riêng bạn. :)
Tự mình sử dụng trình phân tích cú pháp JSON được tích hợp sẵn và chưa bao giờ tìm kiếm giải pháp thay thế.

EDIT: Bây giờ tôi đang sử dụng trình bao bọc chú thích mỏng từ DroidParts.

2

Tôi nghĩ câu hỏi là liệu có được xây dựng trong một là đủ tốt. Nếu nó là, chắc chắn, giảm thiểu phụ thuộc thường là một chiến lược tốt. Đủ tốt có thể đề cập đến cả hiệu quả và tính dễ sử dụng.

Đối với những gì đáng giá, Jackson cũng có mô hình cây phong nha cũng như ràng buộc dữ liệu đầy đủ. Mô hình cây nhanh hơn đáng kể so với trình phân tích cú pháp mặc định (phân tích nhanh hơn 3x-5x trên J2SE, có thể tương tự trên các nền tảng khác như Android, mô hình cây có thể hiệu quả hơn). Hoặc: nếu bạn không muốn phụ thuộc vào jar thứ hai (cần có bản đồ cho mô hình cây và ràng buộc dữ liệu), viết cây của riêng bạn để bao gồm các trường hợp sử dụng cũng đơn giản. Hoặc sử dụng HashMap/ArrayList/wrappers cơ bản, hoặc có các lớp của riêng bạn nếu bạn thích. Builder có thể là 40 dòng mã hàng đầu.

6

Tôi cũng đang sử dụng trình phân tích cú pháp JSON tích hợp trong hầu hết các trường hợp, nhưng gần đây đã bước vào một tình huống không phù hợp: Đối với một số yêu cầu dịch vụ web, tôi nhận được tài liệu JSON lớn hơn 1 MB. Việc tải chúng với trình phân tích cú pháp JSON dựng sẵn đòi hỏi một lượng lớn bộ nhớ chính và dẫn đến kết quả là OutOfMemoryException nhiều lần. Đối với những trường hợp này, trình phân tích cú pháp phát trực tuyến là lựa chọn tốt hơn (mặc dù điều này trở nên bất tiện hơn) và trình phân tích cú pháp JSON được tích hợp sẵn không cung cấp tính năng phát trực tuyến, nhưng chỉ có kiểu giống DOM.

Đối với bất kỳ ai tìm kiếm trình phân tích cú pháp JSON trực tuyến cho Android, tôi thực sự khuyên bạn nên sử dụng Google's GSON. Tôi đã thử Jackson JSON lúc đầu và nó hoạt động tốt cho đến khi tôi cố gắng xây dựng phiên bản phát hành ứng dụng của mình: ProGuard báo cáo một số vấn đề và ứng dụng đang chạy bị lỗi với một số bí ẩn trong hàm dựng của ObjectMapper của Jackson (mặc dù mọi thứ hoạt động tốt trong quá trình gỡ lỗi phiên bản). Ngay cả sau một vài giờ cố gắng xung quanh tôi đã không thể sửa lỗi này. Sau đó tôi chuyển sang GSON sau đó và mọi thứ hoạt động như một sự quyến rũ.

BTW: Bình chỉ truyền trực tuyến GSON có kích thước chỉ 14kB - vì vậy không có gì phải lo lắng.

+1

Hóa ra rằng có cách tạo nội dung ProGuard; đồng nghiệp của tôi đã tìm ra nó. Tôi hy vọng sẽ thuyết phục anh ta viết blog về các chi tiết, vì tiếc là không phải là một lớp lót. Điểm yếu cơ bản của ProGuard là nó dựa vào phân tích tĩnh, chạy vào rắc rối với sự phản chiếu. Một điều cần lưu ý là nếu chỉ sử dụng các công cụ phát trực tuyến của Jackson (JsonParser, JsonGenerator) từ bình lõi, thì không nên có vấn đề gì. Đó là một phần của người lập bản đồ sử dụng sự phản chiếu rất nhiều. – StaxMan

+0

Bạn có nhớ chỉ việc sử dụng đã chạy vào vấn đề NullPointerException vào hướng chung của giải pháp nếu chúng ta phải sử dụng trình ánh xạ không? – kwogger

+0

Như đã đề cập trong bài viết của tôi, tôi đã không tìm thấy một giải pháp cho 'NullPointerException'. Đó là lý do tại sao tôi đã chuyển sang GSON. – sven

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