一段时间以来,我一直在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;
}
由于某些原因,此操作无效
How to prevent Gson from converting a long number (a json string ) to scientific notation format?
检查调试器后,我的控制流程再也没有进入 serialize(Double src, Type typeOfSrc, JsonSerializationContext context)
@Override
public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {
if(src == src.longValue())
return new JsonPrimitive(src.longValue());
return new JsonPrimitive(src);
}
我尝试过的另一种解决方案
这是我当前的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()));
任何地方的任何帮助都会受到赞赏。
答案 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
}