2016-02-18 45 views
7

我想序列化爲特定的字段或類的空值。Gson序列化null爲特定的類或字段

在GSON中,選項serializeNulls()適用於整個JSON。

實施例:

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;  

創建JSON使用GSON:

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

電流輸出中:

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

希望的輸出:

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

如何實現所需的輸出?

首選的解決方案具有以下屬性:

  • 做默認連載空,
  • 空序列化與特定註釋字段。
+0

@DatoMumladze我更新了我的問題 – Martin

+0

我在Gson中找不到此功能。這裏有一些有趣的[鏈接](https://mindfirejavaexperts.wordpress.com/2014/03/14/how-to-use-gson-library/)或者你可以使用傑克遜序列化對象到JSON並排除空值使用此批註的特定字段'@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)' –

+0

可能的重複[排除基於GSON中的值的序列化中的某些字段](http://stackoverflow.com/questions/13120354/excluding-certain -fields-從序列化的基於上 - 值在-GSON) – tima

回答

0

我有接口檢查時,對象應序列爲空:

public interface JsonNullable { 
    boolean isJsonNull(); 
} 

以及相應的TypeAdapter(支持只寫)

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

如下使用它:

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

在Foo值應該是s的類中字符串爲空。請注意,foo值本身必須不爲空,否則自定義適配器註釋將被忽略。

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