2016-02-18 8 views
7

Ich möchte Nullen für ein bestimmtes Feld oder eine Klasse zu serialisieren.Gson serialisieren Null für bestimmte Klasse oder Feld

In GSON gilt die Option serializeNulls() für den gesamten JSON.

Beispiel:

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;  

Erstellen von JSON mit Gson:

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

Aktuelle ouput:

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

gewünschte Ausgabe:

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

Wie erreicht man die gewünschte Leistung?

Bevorzugte Lösung würde die folgenden Eigenschaften haben:

  • Sie NICHT serialize nulls standardmäßig
  • Serialize nulls für Felder mit einer bestimmten Anmerkung.
+0

@DatoMumladze Ich aktualisierte meine Frage – Martin

+0

Ich konnte diese Funktion in Gson nicht finden. Hier ist ein interessanter [link] (https://mindfirejavaexperts.wordpress.com/2014/03/14/how-to-use-gson-library/) Oder Sie können Jackson verwenden, um Objekt zu json zu serialisieren und Nullwerte für auszuschließen bestimmte Felder mit dieser Annotation '@JsonSerialize (include = JsonSerialize.Inclusion.NON_NULL)' –

+0

Mögliches Duplikat von [Ausschließen bestimmter Felder von Serialisierung basierend auf dem Wert in GSON] (http://stackoverflow.com/questions/13120354/excluding-certain -fields-from-serialization-basierte-on-value-in-gson) – tima

Antwort

0

Ich habe Schnittstelle, wenn zu überprüfen Objekt als null serialisiert werden soll:

public interface JsonNullable { 
    boolean isJsonNull(); 
} 

und die entsprechenden TypeAdapter (unterstützt nur schreiben)

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; 
    } 
} 

Verwenden Sie es wie folgt:

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

In der Klasse, wo Foo Wert sollte s sein erialisiert als null. Beachten Sie, dass der foo-Wert selbst nicht null sein muss, da sonst die benutzerdefinierte Adapteranmerkung ignoriert wird.

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