2012-07-09 16 views
20

Czy istnieje sposób konwersji wartości int/short na wartości logiczne? Otrzymuję JSON, który wygląda tak:Konwersja int do booleans

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

próbuję serializować go do typu, który wygląda tak:

class UserInfo { 

    @SerializedName("is_user") 
    private boolean isUser; 

    @SerializedName("is_guest") 
    private boolean isGuest; 

    /* ... */ 
} 

Jak mogę dokonać Gson przetłumaczyć te krótkie pola INT/do booleans?

Odpowiedz

44

start dostając Gson 2.2.2 lub nowszej. Wcześniejsze wersje (w tym 2.2) nie obsługują adapterów typów dla typów pierwotnych. Następnie napisać adapter typu, który konwertuje liczby całkowite do wartości logicznych:

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

... a potem użyć tego kodu, aby utworzyć wystąpienie Gson:

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

Należy pamiętać, że ciąg "1" nie jest konwertowany na "true": 'Boolean.parseBoolean (" 1 ")' to "false". –

+4

Zastąp 'Boolean.parseBoolean (in.nextString());' z 'in.nextString(). EqualsIgnoreCase (" 1 ");' do rozwiązania problemu, o którym wspomniał @LucaFagioli – NPE

0

Jeśli czytasz je jako wskazówki lub szortów, a następnie można po prostu

boolean b = (i != 0) 

gdzie b jest logiczna chcesz dostać i jest int lub krótkie wartość.

Jeśli czytasz je jako ciągi następnie chcesz

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

lub

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

Jak to wpisują się w 'nowy Gson() .fromJson (jsonString, UserInfo.class) '? –