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,Class clazz){ 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数字精度丢失问题的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。