2014-09-12 5 views
10

Ho una classe Java con molti campi interi e quando voglio serializzarli su una stringa json a causa di alcuni di essi potrebbero non avere alcun valore, quindi dopo la serializzazione tutti gli interi ottengono zero come valori! Voglio config gson per non serializzarli se non hanno alcun valore.come configurare gson per escludere 0 valori interi

Per esempio io ho questa classe:

class Example { 
    String title = "something"; 
    int id = 22; 
    int userId; 
} 

da GSON impostazione predefinita mi dà questo risultato:

{ 
    "title" : "something", 
    "id" : 22, 
    "userId" : 0 
} 

ma io non voglio l'userId da serializzare quando il suo valore è 0. così il json dovrebbe essere:

{ 
    "title" : "something", 
    "id" : 22 
} 

per oggetti di GSON predefinito non serializzare oggetti nulli è il re un modo per config gson per non serializzare 0 numeri

+0

Eventuali duplicati di [Utilizzando GSON, come escludere un tipo numerico (doppio, intero) con valore di default dalla serializzazione?] (Http://stackoverflow.com/questions/5316787/using-gson-how- to-exclude-a-numerico-type-double-intero-con-valore-predefinito-f) – tir38

risposta

4

È possibile scrivere un numero personalizzato TypeAdapter.

public class ExampleTypeAdapter extends TypeAdapter<Example> { 

    @Override 
    public Example read(com.google.gson.stream.JsonReader in) 
      throws IOException { 
     final Example example = new Example(); 

     in.beginObject(); 
     while (in.hasNext()) { 
      String name = in.nextName(); 
      if ("title".equals(name)) { 
       example.title = in.nextString(); 
      } else if ("id".equals(name)) { 
       example.id = in.nextInt(); 
      } else if ("userId".equals(name)) { 
       example.userId = in.nextInt(); 
      } 
     } 
     in.endObject(); 

     return example; 
    } 

    @Override 
    public void write(com.google.gson.stream.JsonWriter out, Example example) 
      throws IOException { 
     out.beginObject(); 
     out.name("title").value(example.title); 

     if(example.id != 0) { 
      out.name("id").value(example.id); 
     } 

     if(example.userId != 0) { 
      out.name("userId").value(example.userId); 
     } 

     out.endObject(); 
    } 
} 

provare con codice qui sotto:

GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(Example.class, new ExampleTypeAdapter()); 
gsonBuilder.setPrettyPrinting(); 

Gson gson = gsonBuilder.create(); 

Example example = new Example(); 
example.title = "mytitle"; 
example.id = 1234; 
example.userId = 0; 

final String json = gson.toJson(example); 
System.out.println(json); 

uscita sarà:

{ 
    "title": "my title", 
    "id": 1234 
} 

Nota: parte importante è a write metodo nostra abitudine TypeAdapter.

+0

Ottima risposta! Grazie! – zhaoyuanjie

26

Dobbiamo usare solo la classe Integer.

class Example { 
    String title = "something"; 
    Integer id = 22; 
    Integer userId; 
} 
+1

Questo non è esattamente ciò che la domanda ha richiesto. In questo esempio, hai scambiato 0 per null e sfrutta la funzionalità "non serializzare valori null" di GSON. – CarlG

+0

Questa non è la risposta corretta –