2014-10-28 17 views
11

Sto avendo una classe come segue,Crea JSON String utilizzando GSON

public class Student { 
    public int id; 
    public String name; 
    public int age;  
} 

Ora voglio creare nuova Studente,

//while create new student 
Student stu = new Student(); 
stu.age = 25; 
stu.name = "Guna"; 
System.out.println(new Gson().toJson(stu)); 

Questo mi dà il seguente output,

{"id":0,"name":"Guna","age":25} //Here I want string without id, So this is wrong 

Quindi qui voglio String come

{"name":"Guna","age":25} 

Se voglio modificare studente

//While edit old student 
Student stu2 = new Student(); 
stu2.id = 1002; 
stu2.age = 25; 
stu2.name = "Guna"; 
System.out.println(new Gson().toJson(stu2)); 

Ora la produzione è

{"id":1002,"name":"Guna","age":25} //Here I want the String with Id, So this is correct 

Come posso fare una stringa JSON con un campo [A un certo punto], senza un campo [at qualche punto].

Qualsiasi aiuto sarà molto apprezzabile.

Grazie.

+0

Quando si dichiara una variabile int, il suo valore predefinito è 0. Un int non può essere nullo. Quindi ti consiglio di usare una stringa o di ignorare il valore id se è 0. – joao2fast4u

+0

@ joao2fast4u Ho modificato il mio codice amico – Gunaseelan

+0

@Gunaseelan Controlla la mia risposta per una soluzione migliore. Non è necessario rimuovere la chiave dopo aver creato JSON. –

risposta

16

migliore è usare l'annotazione @expose come

public class Student { 
    public int id; 
    @Expose 
    public String name; 
    @Expose 
    public int age; 
} 

E utilizzare sotto metodo per ottenere stringa JSON dall'oggetto

private String getJsonString(Student student) { 
    // Before converting to GSON check value of id 
    Gson gson = null; 
    if (student.id == 0) { 
     gson = new GsonBuilder() 
     .excludeFieldsWithoutExposeAnnotation() 
     .create(); 
    } else { 
     gson = new Gson(); 
    } 
    return gson.toJson(student); 
} 

Si ignorerà colonna id se questo è impostato su 0, sia restituirà stringa json con campo id.

+0

Sì, penso che questa sia la risposta migliore. Grazie fratello – Gunaseelan

+0

Sei il benvenuto :) –

3

È possibile esplorare l'albero JSON con gson.

provare qualcosa di simile:

gson.toJsonTree(stu1).getAsJsonObject().remove("id"); 

È possibile aggiungere alcune proprietà anche:

gson.toJsonTree(stu2).getAsJsonObject().addProperty("id", "100"); 
1

si hanno due opzioni.

  • Utilizzare la parola chiave transitoria di Java che indica che un campo non deve essere serializzato. Gson lo escluderà automaticamente. Questo potrebbe non funzionare per te come lo vuoi in modo condizionale.

  • Usa @Expose annotazioni per i campi che si desidera e inizializzare il vostro costruttore GSON come segue:

Quindi è necessario marcare nome e l'età campi utilizzando @Expose ed è necessario avere due diverse istanze di Gson per quella di default che include tutti i campi e quella in alto che esclude i campi senza annotazione @Expose.

2
JsonObject jsObj = (JsonObject) new Gson().toJsonTree(stu2); 
jsObj.remove("age"); // remove field 'age' 
jsObj.addProperty("key", "value"); // add field 'key' 

System.out.println(jsObj); 

È possibile manipolare con JsonObject

2

Si dovrebbe introdurre ulteriore campo di Student classe che noterà GSON circa id politica di serializzazione. Quindi, è necessario implementare serializzatore personalizzato che implementerà TypeAdapter. Nell'implementazione di TypeAdapter in base alla politica di serializzazione degli ID, la serializzerete o meno.Poi si dovrebbe registrare il tuo TypeAdapter in GSON fabbrica:

GsonBuilder gson = new GsonBuilder(); 
gson.registerTypeAdapter(Student.class, new StudentTypeAdapter()); 

Spero che questo aiuti.

Problemi correlati