Retrofit & Gson - предотвратить преобразование Long в научную нотацию - PullRequest
0 голосов
/ 20 октября 2018

Резюме

Я уже некоторое время использую 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;


}

ЭтоСнимок экрана, полученный от отладчика

User implements Serializable Response

Решения, которые я пробовал

По какой-то причине это не работает

Как запретить 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()));

Любая помощь в любом месте будет высоко оценена.

1 Ответ

0 голосов
/ 22 ноября 2018

На случай, если кто-то может столкнуться с той же проблемой,

Я использовал Wrapper-Class для ответа, для которого был указан тип данных Object.Для этого Гсон пытался преобразовать его в научную нотацию, несмотря ни на что.

Я должен использовать JsonElement от Гсона

public class GenericResponse_ implements Serializable {

    @SerializedName("status")
    @Expose
    public int status;

    @SerializedName("error")
    @Expose
    public String error;

    @SerializedName("data")
    @Expose
    public JsonElement data; //This was of type Object, changed to JsonElement
}
...