2012-03-07 23 views
18

Todo,GSON Serialize boolean a 0 ó 1

estoy tratando de hacer lo siguiente:

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; 

Así que este pequeño fragmento producirá:

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

pero lo que necesito para producir es:

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

C alguien por favor dame algunas opciones? Yo prefiero no volver a escribir mis booleanos como enteros ya que esto causará varios problemas con el código existente (no obvio, difícil de leer, de difícil aplicación, etc.)

Respuesta

51

Para que sea " forma correcta", puede utilizar algo así

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

y luego usarlo:

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

Espero que esto ayude a alguien :-)

+1

Corregir y respuesta perfecta ... –

+1

Como IntelliJ me señaló, puedes simplificar tu función 'deserialize' en simplemente' return arg0.getAsInt() == 1' –

+0

@TonyChu gracias por tu consejo, corregido :) –

Cuestiones relacionadas