2012-07-09 14 views
20

¿Hay alguna forma de que pueda convertir valores int/cortos en booleanos? Estoy recibiendo JSON que tiene este aspecto:Convertir ints a booleanos

{ is_user: "0", is_guest: "0" } 

Estoy tratando de serializar en un tipo que se parece a esto:

class UserInfo { 

    @SerializedName("is_user") 
    private boolean isUser; 

    @SerializedName("is_guest") 
    private boolean isGuest; 

    /* ... */ 
} 

¿Cómo puedo hacer Gson traducir estos campos INT/cortos en booleanos?

Respuesta

44

empezar por conseguir Gson 2.2.2 o posterior. Las versiones anteriores (incluida la 2.2) no admiten adaptadores de tipo para tipos primitivos. A continuación, escriba un adaptador tipo que convierte los números enteros a los booleanos:

private static final TypeAdapter<Boolean> booleanAsIntAdapter = new TypeAdapter<Boolean>() { 
    @Override public void write(JsonWriter out, Boolean value) throws IOException { 
    if (value == null) { 
     out.nullValue(); 
    } else { 
     out.value(value); 
    } 
    } 
    @Override public Boolean read(JsonReader in) throws IOException { 
    JsonToken peek = in.peek(); 
    switch (peek) { 
    case BOOLEAN: 
     return in.nextBoolean(); 
    case NULL: 
     in.nextNull(); 
     return null; 
    case NUMBER: 
     return in.nextInt() != 0; 
    case STRING: 
     return Boolean.parseBoolean(in.nextString()); 
    default: 
     throw new IllegalStateException("Expected BOOLEAN or NUMBER but was " + peek); 
    } 
    } 
}; 

... y luego usar este código para crear la instancia Gson:

Gson gson = new GsonBuilder() 
     .registerTypeAdapter(Boolean.class, booleanAsIntAdapter) 
     .registerTypeAdapter(boolean.class, booleanAsIntAdapter) 
     .create(); 
+0

Tenga en cuenta que la cadena "1" no se convierte en 'true':' Boolean.parseBoolean ("1") 'es' falso'. –

+4

Reemplazar 'Boolean.parseBoolean (in.nextString());' con 'in.nextString(). EqualsIgnoreCase (" 1 ");' al problema resuelto como se menciona por @LucaFagioli – NPE

0

Si usted les está leyendo en tan enteros o pantalones cortos, a continuación, puedes

boolean b = (i != 0) 

Donde b es el valor booleano que desea obtener y i es el valor int o corto.

Si les está leyendo en forma de cadenas, entonces usted quiere

boolean b = !s.equals("0"); // use this if you WANT null pointer exception 
          // if the string is null, useful for catching 
          // bugs 

o

boolean b = !"0".equals(s); // avoids null pointer exception, but may silently 
          // let a bug through 
+2

¿Cómo encaja eso con 'nueva Gson() .fromJson (jsonString, UserInfo.class) '? –