2012-03-07 86 views
18

所有,GSON序列化布爾值0或1

我試圖做到以下幾點:

public class SomClass 
{ 
    public boolean x; 
    public int y; 
    public String z; 
}  

SomClass s = new SomClass(); 
s.x = true; 
s.y = 10; 
s.z = "ZZZ"; 
Gson gson = new Gson(); 
String retVal = gson.toJson(s); 
return retVal; 

所以這個小片段會產生:

{"x":true,"y":10,"z":"ZZZ"} 

,但我需要什麼它生產的是:

{"x":0, "y":10,"z":"ZZZ"} 

C有人請給我一些選擇?我寧願不重寫我的布爾爲整數的,這將導致與現有代碼的幾個問題(不明顯的,難讀,難執行等)

回答

51

爲了讓「正確」的方式,你可以使用類似的東西

import java.lang.reflect.Type; 

import com.google.gson.JsonDeserializationContext; 
import com.google.gson.JsonDeserializer; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonParseException; 
import com.google.gson.JsonPrimitive; 
import com.google.gson.JsonSerializationContext; 
import com.google.gson.JsonSerializer; 

public class BooleanSerializer implements JsonSerializer<Boolean>, JsonDeserializer<Boolean> { 

    @Override 
    public JsonElement serialize(Boolean arg0, Type arg1, JsonSerializationContext arg2) { 
     return new JsonPrimitive(Boolean.TRUE.equals(arg0)); 
    } 

    @Override 
    public Boolean deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { 
     return arg0.getAsInt() == 1; 
    } 
} 

,然後使用它:

public class Main { 

    public class Base { 
     @Expose 
     @SerializedName("class") 
     protected String clazz = getClass().getSimpleName(); 
     protected String control = "ctrl"; 
    } 

    public class Child extends Base { 
     protected String text = "This is text"; 
     protected Boolean boolTest = false; 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Main m = new Main(); 
     GsonBuilder b = new GsonBuilder(); 
     BooleanSerializer serializer = new BooleanSerializer(); 
     b.registerTypeAdapter(Boolean.class, serializer); 
     b.registerTypeAdapter(boolean.class, serializer); 
     Gson gson = b.create(); 

     Child c = m.new Child(); 
     System.out.println(gson.toJson(c)); 
     String testStr = "{\"text\":\"This is text\",\"boolTest\":1,\"class\":\"Child\",\"control\":\"ctrl\"}"; 
     Child cc = gson.fromJson(testStr, Main.Child.class); 
     System.out.println(gson.toJson(cc)); 
    } 
} 

希望這可以幫助別人:-)

+1

正確與完美的答案... – 2013-07-31 10:51:49

+1

正如IntelliJ指出的,你可以簡化你的'deserialize'函數到簡單的'return arg0.getAsInt()== 1' – 2014-05-09 22:28:14

+0

@TonyChu謝謝你的建議,修正:) – 2014-05-12 09:48:50