Для простоты предположим, что ваша JSON
полезная нагрузка равна:
{
"timestamp": 1555323142345.345
}
И она должна соответствовать:
class Pojo {
private long timestamp;
// getters, setters, toString
}
Решение зависит от того, можете ли вы изменить Pojo
модель или нет,Если да, и вы хотите сохранить double
и long
, можно изменить тип на Number
:
private Number timestamp;
И вы сможете анализировать double
и long
отметки времени.Если вы всегда хотите иметь long
, вам нужно реализовать собственный десериализатор:
class LongOrDoubleJsonDeserializer implements JsonDeserializer<Long> {
@Override
public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonPrimitive()) {
Number number = json.getAsNumber();
return number.longValue();
}
return null;
}
}
И ваше свойство Pojo
должно выглядеть так:
@JsonAdapter(LongOrDoubleJsonDeserializer.class)
private long timestamp;
Если вы не можете изменитьPojo
класс, вам нужно реализовать пользовательский TypeAdapterFactory
и зарегистрироваться, используя GsonBuilder
.Смотрите эту ссылку: Создание экземпляра Retrofit .Пользовательская реализация может выглядеть так:
class LongOrDoubleTypeAdapterFactory implements TypeAdapterFactory {
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
Class<? super T> rawType = type.getRawType();
if (rawType == Long.class || rawType == long.class) {
return new TypeAdapter<T>() {
@Override
public void write(JsonWriter out, T value) {
}
@Override
public T read(JsonReader in) throws IOException {
try {
return (T) new Long(in.nextLong());
} catch (NumberFormatException e) {
return (T) new Long(((Double) in.nextDouble()).longValue());
}
}
};
}
return null;
}
}
и регистрироваться следующим образом:
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(new LongOrDoubleTypeAdapterFactory())
.create();