2011-01-19 14 views
5

Nel framework Play ho alcuni modelli con campi che sono riferimenti a oggetti in altri modelli. Quando uso renderJSON, non voglio che quei riferimenti agli oggetti siano inclusi. Attualmente per i miei bisogni creo una classe del modello di vista separata che contiene i campi che voglio, e nel controller creo istanze di questa classe di vista secondo necessità. Idealmente mi piacerebbe essere in grado di utilizzare la classe del modello stesso senza dover scrivere la classe vista.Impedire la serializzazione di determinati campi

C'è un modo per annotare un campo in modo che non venga serializzato quando si usa renderJSON?

risposta

12

perché il gioco utilizza GSON per la sua serializzazione JSON si può provare il seguente:

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

ora ogni campo contrassegnato come transitoria non verrà serializzato. C'è anche un altro (migliore) modo. È possibile utilizzare l'annotazione com.google.gson.annotations.Expose per contrassegnare ogni campo che si desidera serializzare.

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

grazie! una domanda veloce, perché dici che usare @Expose è meglio? –

+0

@Matias Elorriaga Personalmente mi piace l'approccio esplicito meglio :) Succede spesso a me, che espongo campi accidentalmente. –

-1

Sostituire renderJSON per controllare un nome di campo in un array membro di esclusioni di serializzazione.

0

Non certo perché nessuno ha scritto la soluzione più diretta per questa risposta così lo farò qui:

Contrassegna semplicemente i campi che non vuoi serializzati via Gson come transient.

Ecco un esempio:

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

Nessuno degli elementi che sono contrassegnati transitoria verrà serializzato. Quando deserializzati saranno impostati sui valori predefiniti (classe predefinita).

risultante JSON sarà simile alla seguente:

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

Per ulteriori informazioni su transitori si può vedere i SO Why does Java have transient fields?

Problemi correlati