2015-10-08 19 views
5

Tôi đang làm việc trên trình phân tích cú pháp JSON cho một ứng dụng Android. Khi tôi gọi máy chủ cho dữ liệu, có một số trường tùy chọn, làm thế nào để tôi xử lý điều này trong Retrofit bằng cách sử dụng bộ chuyển đổi GSON?Cách xử lý các trường JSON tùy chọn trong Retrofit cho Android?

phản ứng bình thường

{ 
    "status":"SUCCESS", 
    "class-1":{ 
     "class.enddate":"Jan/10/2016", 
     "class.startdate":"Jan/10/2015", 
     "class.title":"Physics 1", 
     "class.short.description":"Physics 1", 
     "class.description":"This is a Physics Class" 
    } 
} 

phản ứng thay thế, khi một số lĩnh vực không có bất kỳ dữ liệu

{ 
    "status":"SUCCESS", 
    "class-1":{ 
    "class.enddate":"Jan/10/2016", 
    "class.startdate":"Jan/10/2015", 
    "class.title":"Physics 1" 
    } 
} 

POJO Lớp

public class MyClass { 
    @Expose @SerializedName("status") 
    public String status; 

    @Expose @SerializedName("class-1") 
    public MyClassInformation myClassInformation; 
} 

public class MyClassInformation { 
    @Expose @SerializedName("class.title") 
    public String classTitle; 

    @Expose @SerializedName("class.short.description") 
    public String classShortDescription; 

    @Expose @SerializedName("class.description") 
    public String classDescription; 

    @Expose @SerializedName("class.startdate") 
    public String startDate; 

    @Expose @SerializedName("class.enddate") 
    public String endDate; 
} 

Làm thế nào để tạo ra các lớp POJO trong một cách để xử lý các trường tùy chọn không có mặt ? Hiện tại toàn bộ đối tượng MyClassInformation trở thành NULL khi các trường bị thiếu, Xin vui lòng trợ giúp.

+0

Bạn đã thử/phát hiện ra điều gì? Bạn chưa hiển thị nghiên cứu của mình và câu hỏi của bạn có nhiều khả năng sẽ kết thúc hơn. – Sufian

+0

'@Expose @SerializedName (" class-1 ") public SakaiClassInformation sakaiClassInformation;' không khớp với bất kỳ lớp nào trong đoạn mã của bạn. Bạn có lẽ có ý nghĩa để có 'MyClassInformation' có thay vào đó (hoặc có' MyClassInformation' đổi tên thành những gì bạn đang có)? –

+0

Tôi đã thay đổi nó cho phù hợp, xin lỗi chỉ là một lỗi đánh máy – joelj

Trả lời

2

Tôi đã giải quyết vấn đề này bằng thử và sai, quản lý để giải quyết vấn đề bằng cách xóa chú thích @Expose và thay đổi hàm tạo Gson ... Bây giờ toàn bộ đối tượng không bị vô hiệu hoặc loại trừ nếu trường bị thiếu và chỉ các trường bị thiếu hiển thị dưới dạng null.

Đây là những gì tôi đã thay đổi, Từ

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); 

Để

Gson gson = new GsonBuilder().create(); 

Hy vọng nó giúp mọi người, ai đang tìm kiếm một câu trả lời tương tự.

0

Tôi đã vật lộn với điều này vài năm trước.

Có lẽ không có câu trả lời hay cho việc này. Ít nhất không phải là tôi biết.

3 lựa chọn xem xét:

  1. Đặt tất cả các thành viên như-phải lĩnh vực (giả sử tất cả họ đều biết trước) và đặt chúng vào Null trong trường hợp không có giá trị nhận được nơi các loại có ý nghĩa (nó không phải lúc nào có ý nghĩa đối với các kiểu nguyên thủy chẳng hạn). Ở đây bạn đặt nhiều công việc hơn vào những người vượt qua bạn JSON nhưng mã java của bạn đơn giản hơn, ít linh hoạt hơn.
  2. Đặt trường tùy chọn bên trong một vùng chứa các cặp khóa-giá trị trong đó cả khóa và giá trị là Chuỗi. Vùng chứa có thể là danh sách trống nếu không có thuộc tính tùy chọn nào được chuyển. Ở đây bạn có sự linh hoạt hơn nhưng phải làm việc chăm chỉ hơn để tạo ra các serialization tùy biến (de).
  3. Sử dụng một sự kết hợp của 1 và 2.

Mỗi tùy chọn có ưu và nhược điểm và tôi đã kết thúc với tùy chọn 3.

Hy vọng nó giúp và may mắn!

+0

Cảm ơn, nhưng tôi quản lý để làm cho nó hoạt động ... xem câu trả lời của tôi – joelj

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