在其他语言中,long类型可以达到的最大值为
而在JS中,整形的最大的值为 Number.MAX_SAFE_INTEGER
如果溢出就会发生如下诡异的语句
9007199254740993==9007199254740992;//true
方法一:
import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.LongSerializationPolicy; import java.util.HashMap; /** * Created by User on 2017/8/17. */ public class JsonUtil { static Gson gson; static { GsonBuilder gsonBuilder = new GsonBuilder(); //LongSerializationPolicy.STRING将Long类型转换成String类型 gsonBuilder.setLongSerializationPolicy(LongSerializationPolicy.STRING); gson = gsonBuilder.create(); } /** * 对序列化的Long类型进行特殊处理,避免位数过大导致和js精度的丢失,只用于向页面发送json数据时使用 js 最大 1<<57-1 */ public static String toJson(Object object) { return gson.toJson(object); } public static void main(String[] args) { HashMap hashMap = new HashMap(); hashMap.put("userId", 45203118504023803L); hashMap.put("datetime", 1500135055000L); String s = gson.toJson(hashMap); System.out.println(s); } }
方法二:
/** * 对序列化的Long类型进行特殊处理,避免位数过大导致和js精度的丢失,只用于向页面发送json数据时使用 */ static ObjectSerializer longSerializer = new LongSerializer(); static class LongSerializer implements ObjectSerializer{ public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int i) throws IOException { SerializeWriter out = serializer.getWriter(); if ( object == null ) { if ( out.isEnabled(SerializerFeature.WriteNullNumberAsZero) ) { out.write('0'); } else { out.writeNull(); } return; } out.writeString(object.toString()); } public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType) throws IOException { SerializeWriter out = serializer.getWriter(); if ( object == null ) { if ( out.isEnabled(SerializerFeature.WriteNullNumberAsZero) ) { out.write('0'); } else { out.writeNull(); } return; } out.writeString(object.toString()); } } public static String toJson(Object object) { SerializeWriter out = new SerializeWriter(); try { //此处必须new一个SerializeConfig,防止修改默认的配置 JSONSerializer serializer = new JSONSerializer(out, new SerializeConfig()); serializer.getMapping().put(long.class, longSerializer); serializer.getMapping().put(Long.class, longSerializer); serializer.write(object); return out.toString(); } finally { out.close(); } }