2016-02-18 10 views
7

Desidero serializzare valori null per un campo o una classe specifici.serializzazione Gson null per classe o campo specifico

In GSON, l'opzione serializeNulls() si applica all'intero JSON.

Esempio:

class MainClass { 
    public String id; 
    public String name; 
    public Test test; 
} 

class Test { 
    public String name; 
    public String value;  
} 

MainClass mainClass = new MainClass(); 
mainClass.id = "101" 
// mainClass has no name. 
Test test = new Test(); 
test.name = "testName"; 
test.value = null; 
mainClass.test = test;  

Creazione JSON utilizzando GSON:

GsonBuilder builder = new GsonBuilder().serializeNulls(); 
Gson gson = builder.create(); 
System.out.println(gson.toJson(mainClass)); 

ouput attuale:

{ 
    "id": "101", 
    "name": null, 
    "test": { 
     "name": "testName", 
     "value": null 
    } 
} 

output desiderato:

{ 
    "id": "101", 
    "test": { 
     "name": "testName", 
     "value": null 
    } 
} 

Come ottenere l'uscita desiderata?

soluzione preferita avrebbe le seguenti proprietà:

  • fare NON nulls serializzare per impostazione predefinita,
  • nulls Serializzazione per i campi con specifica annotazione.
+0

@DatoMumladze Ho aggiornato la mia domanda – Martin

+0

Non ho trovato questa funzione in Gson. Ecco alcuni interessanti [link] (https://mindfirejavaexperts.wordpress.com/2014/03/14/how-to-use-gson-library/) Oppure puoi usare Jackson per serializzare l'oggetto su json ed escludere valori nulli per campi specifici utilizzando questa annotazione '@JsonSerialize (include = JsonSerialize.Inclusion.NON_NULL)' –

+0

Possibile duplicato di [Escludere determinati campi dalla serializzazione in base al valore in GSON] (http://stackoverflow.com/questions/13120354/excluding-certain -campi-da-serializzazione-based-on-value-in-GSON) – tima

risposta

0

devo interfaccia per controllare quando oggetto deve essere serializzato nullo:

public interface JsonNullable { 
    boolean isJsonNull(); 
} 

E corrispondente TypeAdapter (supporti scrivere solo)

public class JsonNullableAdapter extends TypeAdapter<JsonNullable> { 

    final TypeAdapter<JsonElement> elementAdapter = new Gson().getAdapter(JsonElement.class); 
    final TypeAdapter<Object> objectAdapter = new Gson().getAdapter(Object.class); 

    @Override 
    public void write(JsonWriter out, JsonNullable value) throws IOException { 
    if (value == null || value.isJsonNull()) { 
     //if the writer was not allowed to write null values 
     //do it only for this field 
     if (!out.getSerializeNulls()) { 
     out.setSerializeNulls(true); 
     out.nullValue(); 
     out.setSerializeNulls(false); 
     } else { 
     out.nullValue(); 
     } 
    } else { 
     JsonElement tree = objectAdapter.toJsonTree(value); 
     elementAdapter.write(out, tree); 
    } 
    } 

    @Override 
    public JsonNullable read(JsonReader in) throws IOException { 
    return null; 
    } 
} 

usarlo come segue:

public class Foo implements JsonNullable { 
    @Override 
    public boolean isJsonNull() { 
    // You decide 
    } 
} 

Nella classe in cui il valore Foo deve essere s erializzato come nullo. Si noti che il valore foo stesso non deve essere nullo, altrimenti l'annotazione dell'adattatore personalizzato verrà ignorata.

public class Bar { 
    @JsonAdapter(JsonNullableAdapter.class) 
    public Foo foo = new Foo(); 
} 
Problemi correlati