2016-11-23 76 views
1

假設我有以下POJO- 傑克遜序列化過程中把空的集合爲空以JSON

public class Pojo { 
    private Set<String> stringSet = new HashSet<>(); 
} 

當我做到這一點序列化到JSON,我有以下輸出

{"stringSet":[]} 

然而,按要求,我需要如下:

{"stringSet":null} 

我試圖實現自定義StdSerializer<Set>

public class CustomStdSerializer extends StdSerializer<Set> { 
    protected CustomStdSerializer() { 
     super(Set.class); 
    } 

    @Override 
    public void serialize(Set set, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { 
     if (set.size() == 0){ 
      jsonGenerator.writeNull(); 
     } 

    } 
} 

但它的輸出如下

{"stringSet":} 

我怎麼能寫在JSON空值?

+0

只有當你有一個非空的Set時,這是錯誤的JSON輸出?我注意到你的'serialize'函數定義瞭如果該集合是空的,該怎麼做,但如果不是,該怎麼做。 – yshavit

+0

不,這個錯誤的json是爲空集(size()== 0)生成的。對於其他情況,這是完全有效的。 –

+0

我用'Serializer'得到'{「stringSet」:null}'你使用哪個版本的jackson?還請顯示您的代碼,序列化您的POJO –

回答

0

前段時間我有完全相同的要求。

爲什麼你會得到一個[] stringSet的原因是因爲聲明本身時你正在做new HashSet<>();

,我敢肯定,在你的setter方法,你可能會簡單地做

public void setStringSet(Set<String> stringSet){ 
    this.stringSet = stringSet; 
} 

,而不是你可以做

public void setStringSet(Set<String> stringSet){ 
    if(stringSet.isEmpty()){ 
     this.stringSet.clear(); 
    } else{ 
     this.stringSet = stringSet; 
    } 
} 

這對我來說工作得很好。