2012-07-09 81 views
20

有沒有一種方法可以將int/short值轉換爲布爾值?我收到JSON看起來像這樣:轉換整數爲布爾值

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

我想它序列化到一個類型,如下所示:

class UserInfo { 

    @SerializedName("is_user") 
    private boolean isUser; 

    @SerializedName("is_guest") 
    private boolean isGuest; 

    /* ... */ 
} 

我怎樣才能讓GSON翻譯這些INT /短場進入布爾值?

回答

44

開始通過獲取GSON 2.2.2或更高版本。早期版本(包括2.2)不支持原始類型的類型適配器。接下來,編寫轉換整數布爾型適配器:

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

...然後使用此代碼來創建GSON實例:

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

請注意,字符串「1」未轉換爲「true」:Boolean.parseBoolean(「1」)爲false。 – 2014-08-14 01:36:49

+4

用'in.nextString()。equalsIgnoreCase(「1」)替換'Boolean.parseBoolean(in.nextString());'解決@LucaFagioli提到的問題 – NPE 2014-09-23 04:29:19

0

如果你在閱讀他們作爲整數或短褲,那麼你可以

boolean b = (i != 0) 

當b爲你想要得到的布爾i爲int或short值。

如果你在閱讀他們的字符串,那麼你想

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

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

那如何適應與'新GSON() .fromJson(jsonString,UserInfo.class)'? – 2012-07-09 16:19:35