gson ajax 数字精度丢失问题的解决方法
ajax传输的json,gson会发生丢失,long>15的时候会丢失0
解决方案:直接把属性为long的属性自动加上双引号成为js的字符串,这样就不会发生丢失了,ajax自动识别为字符串。
用法:
ajaxResult("",0,newObject());//随便一个对象就可以,List之类的
/**
*以Ajax方式输出常规操作结果
*
*@paramstatus
*返回状态,200表示成功,500表示错误
*@parammessage
*操作结果描述
*@paramtag
*附加数据
*@return
*/
protectedActionResultajaxResult(intstatus,finalStringmessage,Objecttag){
JsonObjectjson=newJsonObject();
json.addProperty("status",status);
json.addProperty("message",message);
StringstrJson=json.toString();
if(tag!=null){
StringBuffersb=newStringBuffer();
sb.append(strJson.substring(0,strJson.length()-1));
sb.append(",\"tag\":");
sb.append(GsonUtils.toJsonWithGson(tag));
sb.append("}");
strJson=sb.toString();
}
returnwriteJson(strJson);
}
/**
*向客户端输出文本信息
*
*@parammessage
*@return
*/
protectedActionResultwrite(finalStringmessage){
returnnewActionResult(){
@Override
publicvoidrender(BeatContextarg0)throwsException{
beat.getResponse().setCharacterEncoding("UTF-8");
beat.getResponse().setContentType("text/json;charset=UTF-8");
PrintWriterout=beat.getResponse().getWriter();
out.print(message);
out.close();
}
};
}
/**
*向客户端输出文本信息
*
*@parammessage
*@return
*/
protectedActionResultwriteText(finalStringmessage){
returnnewActionResult(){
@Override
publicvoidrender(BeatContextarg0)throwsException{
beat.getResponse().setCharacterEncoding("UTF-8");
beat.getResponse().setContentType("application/text");
PrintWriterout=beat.getResponse().getWriter();
out.print(message);
out.close();
}
};
}
GsonUtils.java
packagecom.xxx.xxx.common.util.gson;
importcom.google.gson.*;
importjava.lang.reflect.Type;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Map;
publicclassGsonUtils{
//privatestaticLoglogger=LogFactory.getLog(GsonUtils.class);
publicstaticStringtoJsonWithGson(Objectobj){
Gsongson=createGson();//newGson();
returngson.toJson(obj);
}
publicstaticStringtoJsonWithGson(Objectobj,Typetype){
Gsongson=createGson();//newGson();
returngson.toJson(obj,type);
}
@SuppressWarnings("unchecked")
publicstaticStringtoJsonWithGson(Listlist){
Gsongson=createGson();//newGson();
returngson.toJson(list);
}
@SuppressWarnings("unchecked")
publicstaticStringtoJsonWithGson(Listlist,Typetype){
Gsongson=createGson();//newGson();
returngson.toJson(list,type);
}
publicstaticStringtoJsonWithGsonBuilder(Objectobj){
Gsongson=newGsonBuilder().setExclusionStrategies(newMyExclusionStrategy()).serializeNulls().create();
returngson.toJson(obj);
}
publicstaticStringtoJsonWithGsonBuilder(Objectobj,Typetype){
Gsongson=newGsonBuilder().setExclusionStrategies(newMyExclusionStrategy()).serializeNulls().create();
returngson.toJson(obj,type);
}
@SuppressWarnings("unchecked")
publicstaticStringtoJsonWithGsonBuilder(Listlist){
Gsongson=newGsonBuilder().setExclusionStrategies(newMyExclusionStrategy()).serializeNulls().create();
returngson.toJson(list);
}
@SuppressWarnings("unchecked")
publicstaticStringtoJsonWithGsonBuilder(Listlist,Typetype){
Gsongson=newGsonBuilder().setExclusionStrategies(newMyExclusionStrategy()).serializeNulls().create();
returngson.toJson(list,type);
}
publicstaticObjectfromJson(Stringjson,Classclazz){
Objectobj=null;
try{
Gsongson=newGson();
obj=gson.fromJson(json,clazz);
}catch(Exceptione){
//logger.error("fromJson方法转换json串到实体类出错",e);
}
returnobj;
}
/**
*如果Long的数字超过15位,转换为String,在json中数字两边有引号
*@return
*/
privatestaticGsoncreateGson(){
GsonBuildergsonBuilder=newGsonBuilder();
LongSerializerserializer=newLongSerializer();
gsonBuilder.registerTypeAdapter(Long.class,serializer);
gsonBuilder.registerTypeAdapter(long.class,serializer);
Gsongson=gsonBuilder.create();
returngson;
}
publicstaticvoidmain(String...args)throwsException{
//longa=12345678901234578L;
//
//GsonBuilderbuilder=newGsonBuilder();
//builder.registerTypeAdapter(Long.class,newLongSerializer());
//Gsongson2=builder.create();
//System.out.println(gson2.toJson(a));
//
//Gsongson=newGsonBuilder().setExclusionStrategies(newMyExclusionStrategy()).serializeNulls().create();
//Stringstr=gson.toJson(a);
//System.out.println(str);
TestVOvo=newTestVO();
vo.setId(618708732263538688L);
vo.setId2(918708732263538688L);
System.out.println(toJsonWithGson(vo));
}
staticclassLongSerializerimplementsJsonSerializer{
publicJsonElementserialize(Longsrc,TypetypeOfSrc,JsonSerializationContextcontext){
if(src!=null){
StringstrSrc=src.toString();
if(strSrc.length()>15){
returnnewJsonPrimitive(strSrc);
}
}
returnnewJsonPrimitive(src);
}
}
staticclassTestVO{
publiclonggetId(){
returnid;
}
publicvoidsetId(longid){
this.id=id;
}
privatelongid;
publicLonggetId2(){
returnid2;
}
publicvoidsetId2(Longid2){
this.id2=id2;
}
privateLongid2;
}
}
MyExclusionStrategy.java
packagecom.xxx.xxx.common.util.gson;
importcom.google.gson.ExclusionStrategy;
importcom.google.gson.FieldAttributes;
publicclassMyExclusionStrategyimplementsExclusionStrategy{
privatefinalClass>typeToSkip;
publicMyExclusionStrategy(){
this.typeToSkip=null;
}
publicMyExclusionStrategy(Class>typeToSkip){
this.typeToSkip=typeToSkip;
}
publicbooleanshouldSkipClass(Class>clazz){
return(clazz==typeToSkip);
}
publicbooleanshouldSkipField(FieldAttributesf){
returnf.getAnnotation(NotSerialize.class)!=null;
}
}
NotSerialize
packagecom.xxx.xxx.common.util.gson;
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Retention;
importjava.lang.annotation.RetentionPolicy;
importjava.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public@interfaceNotSerialize{
}
以上这篇gsonajax数字精度丢失问题的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。