Retrofit&Gson-防止gson将Long转换为科学计数法

时间:2018-10-20 07:09:21

标签: java android gson retrofit retrofit2

摘要

一段时间以来,我一直在Android应用中使用 Retrofit和Gson ,但是从服务器获得的IDs 13位数字数字。 Gson会自动将这些数字转换为科学计数法,然后将其转换为String/Long,无论我指定什么。

这是带有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

我尝试过的解决方案

由于某些原因,此操作无效

  

How to prevent Gson from converting a long number (a json string ) to scientific notation format?

检查调试器后,我的控制流程再也没有进入 serialize(Double src, Type typeOfSrc, JsonSerializationContext context)

  

switch off scientific notation in Gson double serialization

    @Override
    public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {
        if(src == src.longValue())
            return new JsonPrimitive(src.longValue());          
        return new JsonPrimitive(src);
    }

我尝试过的另一种解决方案

  

How to prevent Gson from expressing integers as floats

这是我当前的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 :(得分:0)

以防万一有人可能遇到相同的问题,

我使用Wrapper-Class进行响应,其数据类型指定为Object。为此,无论如何,Gson都试图将其转换为科学计数法。

我实际上必须使用Gson的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
}