gson ajax 数字精度丢失问题的解决方法

网友投稿 260 2023-06-05


gson ajax 数字精度丢失问题的解决方法

ajax传输的json,gson会发生丢失,long > 15的时候会丢失0

解决方案:直接把属性为long的属性自动加上双引号成为js的字符串,这样就不会发生丢失了,ajax自动识别为字符串。

用法:

ajaxResult("",0,new Object()); //随便一个对象就可以,List 之类的

/**

* 以Ajax方式输出常规操作结果

*

* @param status

* 返回状态,200表示成功, 500表示错误

* @param message

* 操作结果描述

* @param tag

* 附加数据

* @return

*/

protected ActionResult ajaxResult(int status, final String message, Object tag) {

JsonObject json = new JsonObject();

json.addProperty("status", status);

json.addProperty("message", message);

String strJson = json.toString();

if (tag != null) {

StringBuffer sb = new StringBuffer();

sb.append(strJson.substring(0, strJson.length() - 1));

sb.append(",\"tag\":");

sb.append(GsonUtils.toJsonWithGson(tag));

sb.append("}");

strJson = sb.toString();

}

return writeJson(strJson);

}

/**

* 向客户端输出文本信息

*

* @param message

* @return

*/

protected ActionResult write(final String message) {

return new ActionResult() {

@Override

public void render(BeatContext arg0) throws Exception {

beat.getResponse().setCharacterEncoding("UTF-8");

beat.getResponse().setContentType("text/json;charset=UTF-8");

PrintWriter out = beat.getResponse().getWriter();

out.print(message);

out.close();

}

};

}

/**

* 向客户端输出文本信息

*

* @param message

* @return

*/

protected ActionResult writeText(final String message) {

return new ActionResult() {

@Override

public void render(BeatContext arg0) throws Exception {

beat.getResponse().setCharacterEncoding("UTF-8");

beat.getResponse().setContentType("application/text");

PrintWriter out = beat.getResponse().getWriter();

out.print(message);

out.close();

}

};

}

GsonUtils.java

package com.xxx.xxx.common.util.gson;

import com.google.gson.*;

import java.lang.reflect.Type;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

public class GsonUtils {

//private static Log logger = LogFactory.getLog(GsonUtils.class);

public static String toJsonWithGson(Object obj) {

Gson gson = createGson(); //new Gson();

return gson.toJson(obj);

}

public static String toJsonWithGson(Object obj, Type type) {

Gson gson = createGson(); //new Gson();

return gson.toJson(obj, type);

}

@SuppressWarnings("unchecked")

public static String toJsonWithGson(List list) {

Gson gson = createGson(); //new Gson();

return gson.toJson(list);

}

@SuppressWarnings("unchecked")

public static String toJsonWithGson(List list, Type type) {

Gson gson = createGson(); //new Gson();

return gson.toJson(list, type);

}

public static String toJsonWithGsonBuilder(Object obj) {

Gson gson = new GsonBuilder().setExclusionStrategies(new MyExclusionStrategy()).serializeNulls().create();

return gson.toJson(obj);

}

public static String toJsonWithGsonBuilder(Object obj, Type type) {

Gson gson = new GsonBuilder().setExclusionStrategies(new MyExclusionStrategy()).serializeNulls().create();

return gson.toJson(obj, type);

}

@SuppressWarnings("unchecked")

public static String toJsonWithGsonBuilder(List list) {

Gson gson = new GsonBuilder().setExclusionStrategies(new MyExclusionStrategy()).serializeNulls().create();

return gson.toJson(list);

}

@SuppressWarnings("unchecked")

public static String toJsonWithGsonBuilder(List list, Type type) {

Gson gson = new GsonBuilder().setExclusionStrategies(new MyExclusionStrategy()).serializeNulls().create();

return gson.toJson(list, type);

}

public static Object fromJson(String json, Class clazz) {

Object obj = null;

try {

Gson gson = new Gson();

obj = gson.fromJson(json, clazz);

} catch (Exception e) {

//logger.error("fromJson方法转换json串到实体类出错", e);

}

return obj;

}

/**

* 如果 Long 的数字超过15位,转换为String,在json中数字两边有引号

* @return

*/

private static Gson createGson(){

GsonBuilder gsonBuilder = new GsonBuilder();

LongSerializer serializer = new LongSerializer();

gsonBuilder.registerTypeAdapter(Long.class, serializer);

gsonBuilder.registerTypeAdapter(long.class, serializer);

Gson gson = gsonBuilder.create();

return gson;

}

public static void main(String... args) throws Exception{

// long a = 12345678901234578L;

//

// GsonBuilder builder = new GsonBuilder();

// builder.registerTypeAdapter(Long.class, new LongSerializer());

// Gson gson2 = builder.create();

// System.out.println(gson2.toJson(a));

//

// Gson gson = new GsonBuilder().setExclusionStrategies(new MyExclusionStrategy()).serializeNulls().create();

// String str = gson.toJson(a);

// System.out.println(str);

TestVO vo = new TestVO();

vo.setId(618708732263538688L);

vo.setId2(918708732263538688L);

System.out.println(toJsonWithGson(vo));

}

static class LongSerializer implements JsonSerializer {

public JsonElement serialize(Long src, Type typeOfSrc, JsonSerializationContext context) {

if(src!=null){

String strSrc = src.toString();

if(strSrc.length()>15){

return new JsonPrimitive(strSrc);

}

}

return new JsonPrimitive(src);

}

}

static class TestVO {

public long getId() {

return id;

}

public void setId(long id) {

this.id = id;

}

private long id;

public Long getId2() {

return id2;

}

public void setId2(Long id2) {

this.id2 = id2;

}

private Long id2;

}

}

MyExclusionStrategy.java

package com.xxx.xxx.common.util.gson;

import com.google.gson.ExclusionStrategy;

import com.google.gson.FieldAttributes;

public http://class MyExclusionStrategy implements ExclusionStrategy {

private final Class> typeToSkip;

public MyExclusionStrategy(){

this.typeToSkip=null;

}

public MyExclusionStrategy(Class> typeToSkip) {

this.typeToSkip = typeToSkip;

}

public boolean shouldSkipClass(Class> clazz) {

return (clazz == typeToSkip);

}

public boolean shouldSkipField(FieldAttributes f) {

return f.getAnnotation(NotSerialize.class) != null;

}

}

NotSerialize

package com.xxx.xxx.common.util.gson;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.FIELD})

public @interface NotSerialize {

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解vue父子模版嵌套案例
下一篇:Android studio报: java.lang.ExceptionInInitializerError 错误
相关文章

 发表评论

暂时没有评论,来抢沙发吧~