2012-03-07 2 views
18

Все,GSON Serialize булева 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

Правильный и идеальный ответ ... –

+1

Как указал IntelliJ для меня, вы можете упростить функцию 'deserialize' в просто' return arg0.getAsInt() == 1' –

+0

@TonyChu за советом, исправлено :) –