2011-01-19 24 views
5

Trong khung chơi, tôi có một vài mô hình có trường là đối tượng tham chiếu đến các mô hình khác. Khi tôi sử dụng renderJSON, tôi không muốn các tham chiếu đối tượng đó được bao gồm. Hiện nay cho nhu cầu của tôi, tôi tạo ra một lớp mô hình xem riêng biệt có chứa các lĩnh vực tôi muốn, và trong bộ điều khiển tôi tạo ra trường hợp của lớp xem này khi cần thiết. Lý tưởng nhất là tôi muốn có thể sử dụng chính lớp mô hình mà không cần phải viết lớp xem.Ngăn không cho các trường nhất định được tuần tự hóa

Có cách nào để chú thích một trường sao cho trường đó sẽ không được sắp xếp tuần tự khi sử dụng renderJSON không?

Trả lời

12

vì chơi sử dụng Gson cho serialization Json của nó bạn có thể thử như sau:

public static void test() 
{ 
    Object foo = new SomeObject("testData"); 
    Gson gson = new GsonBuilder() 
     .excludeFieldsWithModifiers(Modifier.TRANSIENT) 
     .create(); 
    renderJSON(gson.toJson(foo)); 
} 

tại từng lĩnh vực được đánh dấu là thoáng qua sẽ không được đăng. Ngoài ra còn có một cách khác (tốt hơn). Bạn có thể sử dụng chú thích com.google.gson.annotations.Expose để đánh dấu từng trường bạn muốn tuần tự hóa.

public static void test() 
{ 
    Object foo = new SomeObject("testData"); 
    Gson gson = new GsonBuilder() 
     .excludeFieldsWithoutExposeAnnotation() 
     .create(); 
    renderJSON(gson.toJson(foo)); 
} 
+0

cảm ơn! một câu hỏi nhanh, tại sao bạn nói rằng sử dụng @Expose là tốt hơn? –

+0

@Matias Elorriaga Cá nhân tôi thích cách tiếp cận rõ ràng hơn :) Nó thường xảy ra với tôi, rằng tôi phơi bày các trường vô tình. –

-1

Tôi sẽ ghi đè lên renderJSON để kiểm tra tên trường đối với mảng thành viên của loại trừ tuần tự hóa.

0

Không chắc lý do tại sao không có ai đã viết các giải pháp trực tiếp nhất để câu trả lời này vì vậy tôi sẽ làm điều đó ở đây:

Đơn giản chỉ cần đánh dấu các lĩnh vực bạn không muốn serialized thông qua Gson là transient.

Dưới đây là một ví dụ:

public class Animal 
{ 
     private String name = "dog"; 
     transient private int port = 80; 
     private String species = "canine"; 
     transient private String password = "NoOneShouldSeeThis"; 
} 

Không ai trong số các mục được đánh dấu thoáng qua sẽ được đăng. Khi được deserialized chúng sẽ được đặt thành giá trị mặc định (mặc định lớp học).

Kết quả JSON sẽ trông giống như sau:

{"name":"dog","species":"canine"} 

Để biết thêm thông tin về thoáng qua bạn sẽ nhìn thấy SO Why does Java have transient fields?

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