当前位置: 移动技术网 > IT编程>开发语言>Java > gson ajax 数字精度丢失问题的解决方法

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

神的重生,猕猴异录,不负妻缘

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 <t> object fromjson(string json, class<t> 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<long> {
    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 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 { 
}

以上这篇gson ajax 数字精度丢失问题的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网