2017-01-20 6 views
1

АНИ мое приложение обменивается данными с посылает ответы, которые выглядят следующим образом:Gson: обрабатывать поле объекта json, которое может возвращать разные примитивные типы?

{ 
    id:12345, 
    active:1 
} 

Проблема заключается в том, что старые версии API отправляет поле ответа как логическое значение, а не междунар как так

{ 
    id:12345, 
    active:false, 
} 

С Gson, как я могу обращаться с обоими, не знающими, какая версия будет возвращена?

+1

Возьмите его как «объект» .. – Meenal

+0

вы можете проверить и, если условие вроде как, если (1 || ложь) {} –

ответ

3

Зарегистрировать CustomDeserializer для булевы и когда-либо логическое значение встречается внутри какого-либо объекта, gson попытается десериализации с правилами, которые вы определили.

@Data 
class JsonTestClass { 
    Boolean active = new Boolean(true); 
    Integer id; 
} 

class BooleanJsonDeserializer implements JsonDeserializer<Boolean> { 
    @Override 
    public Boolean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
      throws JsonParseException { 
     JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive(); 
     if (jsonPrimitive.isBoolean()) { 
      return jsonPrimitive.getAsBoolean(); 
     } else { 
      return jsonPrimitive.getAsInt() == 0 ? false : true; 
     } 
    } 
} 

// TempJson 
public static void main(String[] args) throws Exception { 
    Gson gson = new GsonBuilder() 
      .registerTypeAdapter(Boolean.class, new BooleanJsonDeserializer()).create(); 

    System.out.println(gson.fromJson("{id:12345,active:1}", JsonTestClass.class).getActive()); 
    System.out.println(gson.fromJson("{id:12345,active:0}", JsonTestClass.class).getActive()); 
    System.out.println(gson.fromJson("{id:12345,active:false}", JsonTestClass.class).getActive()); 
    System.out.println(gson.fromJson("{id:12345,active:true}", JsonTestClass.class).getActive()); 
} 

Выход:

true 
false 
false 
true 
+0

Я бы отметить этот ответ как лучший. Просто небольшое примечание. Имя 'BooleanJsonDeserializer' ближе к описанию того, что делает этот класс, чем' BooleanTypeAdapter', поскольку 'TypeAdapter' в Gson ориентированы на поток, тогда как 'JsonDeserializer' ориентированы на дерево. –

+1

@LyubomyrShaydariv Изменено имя :) Используется TypeAdapter при регистрации в GSON как TypeAdapter –

0

PFB способ справиться с этим.

public static void main(String[] args) { 
    Gson gson = new Gson(); 
    JsonObject obj = gson.fromJson("{ id:12345, active:1}", JsonObject.class); 
    JsonPrimitive prim = obj.get("active").getAsJsonPrimitive(); 
    if(prim.isBoolean()){ 
     System.out.println("boolean"); 
    }else{ 
     System.out.println("number"); 
    } 
}