Резюме
Я уже некоторое время использую Retrofit и Gson в моем приложении для Android, но IDs
, которые я получаю с сервера, 13 цифр .Gson автоматически преобразует эти числа в научную запись, а затем преобразует их в String/Long
, что бы я ни указывал.
Вот пример класса Retrofit с ID
public class User implements Serializable {
@SerializedName("accessToken")
@Expose
public String accessToken;
@SerializedName("userId")
@Expose
public String userId; //This is where it casts it into a Scientific notation
@SerializedName("userRole")
@Expose
public int userRole;
@SerializedName("name")
@Expose
public String name;
@SerializedName("mobile")
@Expose
public String mobile;
@SerializedName("countryId")
@Expose
public String countryId; //Here too
@SerializedName("email")
@Expose
public String email;
@SerializedName("username")
@Expose
public String username;
}
ЭтоСнимок экрана, полученный от отладчика
Решения, которые я пробовал
По какой-то причине это не работает
Как запретить Gson преобразовать длинное число (строку json) в научный формат записи?
Как япроверил отладчик, мой поток управления никогда не переходит в serialize(Double src, Type typeOfSrc, JsonSerializationContext context)
отключить научную запись в двойной сериализации Gson
@Override
public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {
if(src == src.longValue())
return new JsonPrimitive(src.longValue());
return new JsonPrimitive(src);
}
Другое решение, которое я пробовал
Как запретить Gson выражать целые числа как числа с плавающей точкой
И это мой текущий метод RetrofitBuilder
Retrofit.Builder rBuilder = new Builder();
rBuilder.baseUrl(API_URL);
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Double.class, new JsonSerializer<Double>() {
@Override
public JsonElement serialize(final Double src, final Type typeOfSrc, final JsonSerializationContext context) {
BigDecimal value = BigDecimal.valueOf(src);
return new JsonPrimitive(value);
}
});
gsonBuilder.registerTypeAdapter(Long.class, new JsonSerializer<Long>() {
@Override
public JsonElement serialize(final Long src, final Type typeOfSrc, final JsonSerializationContext context) {
BigDecimal value = BigDecimal.valueOf(src);
return new JsonPrimitive(value);
}
});
rBuilder.addConverterFactory(GsonConverterFactory.create(gsonBuilder.create()));
Любая помощь в любом месте будет высоко оценена.