2014-06-09 9 views
7

Quando definiamo una classe con seguente formatoGSON come ottenere nome serializzato

public class Field { 
    @SerializedName("name") 
    public String name; 
    @SerializedName("category") 
    public String category; 

} 

per il JsonObject contenuti

{ 
    "name" : "string", 
    "category" : "string", 
} 

e utilizzando Gson per analizzare il contenuto

Field field = new GsonBuilder().create().fromJson(
       content, Field.class); 

Così , la mia domanda è possibile utilizzare Gson per ottenere loNome. In questo caso, voglio sapere che nome è utilizzato per @Serializedfield.name, che è name e per field.category che è category.

Secondo suggerito da @Sotirios Delimanolis, utilizzando Reflection possiamo ottenere il nome Serialized

java.lang.reflect.Field fields = Field.class.getDeclaredField("name");    
SerializedName sName =fields.getAnnotation(SerializedName.class);    
System.out.println(sName.value()); 
+1

se disponiamo di "nome", non è necessario utilizzare il riflesso e ottenere il valore. c'è un modo per ottenere solo dal campo come solo usando la variabile 'name' senza effettivamente usare il" nome "della stringa –

risposta

9

utilizzare la reflection per recuperare l'oggetto Field che si desidera. È quindi possibile utilizzare Field#getAnnotation(Class) per ottenere un'istanza SerializedName in cui è possibile chiamare value() per ottenere il nome.

+0

Sto usando in questo modo' field' è il mio 'Object' della classe' Field'. E sto usando 'field.name.getClass(). GetAnnotation (SerializedName.class) .value()'. Ma mi dà "NullPointer Exception". – laaptu

+1

@laaptu Non aiuta che la tua classe si chiami 'Field'. Intendevo 'java.lang.reflect.Field'. Ottieni l'oggetto 'Class' della ** tua ** classe' Field' e usa 'getDeclaredField()' per ottenere l'oggetto 'Field' per il tuo campo' name'. –

+2

'java.lang.reflect.Field fields = Field.class.getDeclaredField (" name "); \t \t \t SerializedName sName = fields.getAnnotation (SerializedName.class); \t \t \t System.out.println (sName.value()); 'Grazie per questo. Ma non c'è nessun altro metodo che posso implementare senza 'reflection' come ho sentito dire' reflection' è un uso intensivo della CPU. E lo sto sviluppando per 'Android' – laaptu