2011-01-19 20 views
5

En el marco de reproducción, tengo algunos modelos que tienen campos que son referencias de objeto a otros modelos. Cuando uso renderJSON, no quiero que se incluyan esas referencias de objeto. Actualmente, para mis necesidades, creo una clase de modelo de vista separada que contiene los campos que quiero, y en el controlador creo instancias de esta clase de vista según sea necesario. Idealmente, me gustaría poder utilizar la clase de modelo en sí misma sin tener que escribir la clase de vista.Evitar que ciertos campos se serialicen

¿Hay alguna manera de anotar un campo para que no se serialice al usar renderJSON?

Respuesta

12

porque el juego utiliza Gson por su serialización JSON se puede intentar lo siguiente:

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

ahora cada campo marcado como no va a ser serializado transitoria. También hay otra (mejor) forma. Puede usar la anotación com.google.gson.annotations.Expose para marcar cada campo que desea serializar.

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

gracias! una pregunta rápida, ¿por qué dice que usar @Expose es mejor? –

+0

@Matias Elorriaga Personalmente, me gusta más el enfoque explícito :) A menudo me pasa que expongo campos accidentalmente. –

-1

Invalidaré renderJSON para verificar el nombre del campo frente a una matriz miembro de exclusiones de serialización.

0
No

seguro de por qué no se ha escrito la solución más directa a esta respuesta, así lo haré aquí:

Simplemente marque los campos que no desea serializar a través de Gson como transient.

He aquí un ejemplo: se puede serializar

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

Ninguno de los artículos que están marcados transitoria. Cuando se deserializan, se establecerán en sus valores predeterminados (valor predeterminado de clase).

resultante JSON se verá como la siguiente:

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

Para obtener más información sobre transitoria se puede ver el así Why does Java have transient fields?

Cuestiones relacionadas