2012-07-09 16 views
20

Gibt es eine Möglichkeit, dass ich int/short Werte in booleans konvertieren kann? Ich erhalte JSON, die wie folgt aussieht:Ints in boolesche Werte konvertieren

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

Ich versuche, es in eine Art serialisiert werden, die wie folgt aussieht:

class UserInfo { 

    @SerializedName("is_user") 
    private boolean isUser; 

    @SerializedName("is_guest") 
    private boolean isGuest; 

    /* ... */ 
} 

Wie kann ich diese int/short Felder machen Gson übersetzen in Booleans?

Antwort

44

Starten von Gson 2.2.2 oder später bekommen. Frühere Versionen (einschließlich 2.2) unterstützen keine Typadapter für primitive Typen. Als nächstes wird eine Art Adapter schreiben, die ganzen Zahlen booleans konvertiert:

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

... und dann diesen Code verwenden, um die Gson Instanz zu erstellen:

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

Beachten Sie, dass der String "1" nicht in "true" konvertiert wird: 'Boolean.parseBoolean (" 1 ")' ist 'false'. –

+4

Ersetze 'Boolean.parseBoolean (in.nextString());' mit 'in.nextString(). EqualsIgnoreCase (" 1 ");' um das Problem zu lösen, wie von @LucaFagioli erwähnt – NPE

0

Wenn Sie sie in als ints oder Shorts lesen, dann können Sie nur

boolean b = (i != 0) 

Wo b der boolean Sie erhalten möchten und i ist der int oder short-Wert.

Wenn Sie sie in als Strings gerade liest dann wollen Sie

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

oder

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

Wie funktioniert das mit 'neuen Gson passen in() .fromJson (jsonString, UserInfo.class) '? –

Verwandte Themen