gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:24:46 27 4
gpt4 key购买 nike

总结

我在我的 android 应用程序中使用 Retrofit 和 Gson 有一段时间了,但是我从服务器获得的 ID13 位数字。 Gson 自动将这些数字转换为科学计数法,然后将其转换为 String/Long,无论我指定什么。

这是一个带有 ID

的示例 Retrofit 类
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()));

我们将不胜感激任何形式的帮助。

最佳答案

以防万一有人遇到同样的问题,

我为响应使用了包装类,指定的数据类型是对象。为此,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
}

关于java - Retrofit & Gson - 防止 gson 将 Long 转换为科学记数法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52903294/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com