fastjson WriteClassName,Double类型不打3.3D
方式一:
public class SerializeConfigX extends SerializeConfig {
public SerializeConfigX() {
put(Double.class, DoubleSerializerX.instance);
put(Long.class, LongCodecX.instance);
}
static class DoubleSerializerX extends DoubleSerializer {
public final static DoubleSerializerX instance = new DoubleSerializerX();
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName,
Type fieldType, int features) throws IOException {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeNull(SerializerFeature.WriteNullNumberAsZero);
return;
}
double doubleValue = ((Double) object).doubleValue();
if (Double.isNaN(doubleValue) //
|| Double.isInfinite(doubleValue)) {
out.writeNull();
} else {
out.writeDouble(doubleValue, false);
}
}
}
static class LongCodecX extends LongCodec {
public static LongCodecX instance = new LongCodecX();
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName,
Type fieldType, int features) throws IOException {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeNull(SerializerFeature.WriteNullNumberAsZero);
} else {
long value = ((Long) object).longValue();
out.writeLong(value);
}
}
}
}
方式二:
public class SerializeConfigX2 extends SerializeConfig {
/**
* private的变量,只能重新定义一把,开销不大。
*/
private ASMSerializerFactory asmFactory;
private boolean asm = !ASMUtils.isAndroid();
{
try {
asmFactory = new ASMSerializerFactory();
} catch (NoClassDefFoundError eror) {
asm = false;
} catch (ExceptionInInitializerError error) {
asm = false;
}
}
@Override
public ObjectSerializer createJavaBeanSerializer(Class<?> clazz) {
if (!Modifier.isPublic(clazz.getModifiers())) {
return new JavaBeanSerializerX(clazz);
}
boolean asm = this.asm;
if (asm && asmFactory.isExternalClass(clazz) || clazz == Serializable.class
|| clazz == Object.class) {
asm = false;
}
{
JSONType annotation = clazz.getAnnotation(JSONType.class);
if (annotation != null && annotation.asm() == false) {
asm = false;
}
}
if (asm && !ASMUtils.checkName(clazz.getName())) {
asm = false;
}
if (asm) {
try {
ObjectSerializer asmSerializer = createASMSerializer(clazz);
if (asmSerializer != null) {
return asmSerializer;
}
} catch (ClassCastException e) {
// skip
} catch (Throwable e) {
throw new JSONException("create asm serializer error, class " + clazz, e);
}
}
return new JavaBeanSerializerX(clazz);
}
class JavaBeanSerializerX extends JavaBeanSerializer {
public JavaBeanSerializerX(Class<?> clazz) {
super(clazz);
}
@Override
public FieldSerializer createFieldSerializer(FieldInfo fieldInfo) {
Class<?> clazz = fieldInfo.getFieldClass();
/**
* 修复android下的bug(非android下使用ASMSerializer,不报错)。
*
* 所有的努力都是为了这里,启用WriteClassName后,原生类型通过ObjectFieldSerializer(
* javabean反射)取得的值是对应的对象,json串会加上对应类型后缀(L、F、D、S、B)。
* 如果javabean使用原生类型定义变量,则反系列化parse时错误。
*
* 在此修复bug:原生类型务必使用NumberFieldSerializer
* (此类为包访问限制,只好复制一个NumberFieldSerializerX)
*
*/
if (clazz == Number.class || clazz == long.class || clazz == int.class
|| clazz == float.class || clazz == double.class || clazz == short.class
|| clazz == byte.class) {
return new NumberFieldSerializerX(fieldInfo);
}
return super.createFieldSerializer(fieldInfo);
}
}
/**
* copy NumberFieldSerializer
*/
class NumberFieldSerializerX extends FieldSerializer {
public NumberFieldSerializerX(FieldInfo fieldInfo) {
super(fieldInfo);
}
@Override
public void writeProperty(JSONSerializer serializer,
Object propertyValue) throws Exception {
writePrefix(serializer);
this.writeValue(serializer, propertyValue);
}
@Override
public void writeValue(JSONSerializer serializer, Object propertyValue) throws Exception {
SerializeWriter out = serializer.getWriter();
Object value = propertyValue;
if (value == null) {
if (out.isEnabled(SerializerFeature.WriteNullNumberAsZero)) {
out.write('');
} else {
out.writeNull();
}
return;
}
out.append(value.toString());
}
}
}
main:
JSON.toJSONString(user, new SerializeConfigX(),
SerializerFeature.WriteClassName, SerializerFeature.DisableCircularReferenceDetect);
fastjson WriteClassName,Double类型不打3.3D的更多相关文章
- Gson格式转换Integer变为Double类型问题解决
问题描述 在前后端分离的开发模式下,前后端交互通常采用JSON格式数据.自然会涉及到json字符串与JAVA对象之间的转换.实现json字符串与Java对象相互转换的工具很多,常用的有Json.Gso ...
- OpenMesh 将默认的 float 类型改为 double 类型
OpenMesh 中默认的数据类型都是 float 类型的,如果要将其默认的 float 类型改为 double 类型,可以这么做: #include <OpenMesh/Core/Mesh/P ...
- C语言基础(7)-float,double,long double类型
1.定义方式 3.14这个就是一个浮点常量,3f是一个浮点类型的常量 float a;//定义了一个浮点类型的小数变量,名字叫a double b;//定义了一个double类型的变量,名字叫b lo ...
- 关于BigDecimal 和 double 类型保存金钱,以及精度问题,银行家舍入法
1. BigDecimal 类型数据 的创建,构造函数 有 public BigDecimal(BigInteger intVal, long val, int scale, int prec); p ...
- 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。
分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...
- iOS 当请求到的数据是double类型,会失去精准度,并且去掉小数点后的0
首先请求到的数据都会变成字符串,先将字符串转化为double类型 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: ...
- 格式化Double类型
//格式化Double类型 //F:默认是2位小数点 //F6:输出小数点后6位,不够的话用0补齐 //G:默认输出原先的,保留小数点后面的位数 LalTotal.Text = "合计:原始 ...
- struts2中Double类型的转换
今天做项目,ssh + Extjs,页面js中定义了几个NumberField,对应的value都是double类型的,其中有个NumberField的name为 name,结果执行的时候报错了,说找 ...
- java double类型保留两位小数4种方法【转】
4种方法,都是四舍五入,例: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberF ...
随机推荐
- 常用模块 - hashlib模块
一.简介 Python的hashlib提供了常见的摘要算法,如MD5.SHA1.SHA224.SHA256.SHA384.SHA512等算法. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过 ...
- MES实施可能会遇到的问题,这里都帮你解决
MES系统选型关键技术的发展已日趋成熟,开发MES系统技术并不是问题,困难的是如何确定系统的功能.规格,如何成功地使用MES系统,以充分发挥其作用,下面给大家分析这两大块内容. 实施MES系统选型的困 ...
- 面试题:什么叫平衡二叉查找树--AVL树
查找.插入和删除在平均和最坏情况下都是O(log n) 增加和删除可能需要通过一次或多次树旋转来重新平衡这个树 节点的平衡因子是它的左子树的高度减去它的右子树的高度.带有平衡因子 1.0 或 -1 的 ...
- WinForm背景图片及图片位置
设置背景图片:BackgroundImage属性选择对应的图片就可以了. 背景图片随窗体的变化而变化:BackgroundImageLayout属性值设置为Stretch. 窗体放置图片:Pictur ...
- Redis的内存分配
内存分配 Redis进程的内存消耗主要包括:自身内存 + 对象内存 + 缓冲内存 + 内存碎片.1 自身内存 Redis自身内存消耗非常少,通常used_memory在800KB左右,used_mem ...
- python的sort和sorted
sort 只适用于列表,返回列表类型. sorted 可适用于字典,元组和列表. 使用方法 sort的使用方法是list.sort(cmp=None, key=None, reverse=False) ...
- Linux学习22-文件上传与下载(rz,sz)
前言 远程访问linux服务器的时候,我们本地电脑需要和linux服务器上有文件上传和下载的操作,如果安装过xshell和xftp工具,可以使用xftp上传文件和下载文件的操作. 如果不用xftp工具 ...
- python正则表达式(5)--findall、finditer方法
findall方法 相比其他方法,findall方法有些特殊.它的作用是查找字符串中所有能匹配的字符串,并以结果存于列表中,然后返回该列表 注意: match 和 search 是匹配一次 finda ...
- YUV和RGB格式单像素所占内存大小分析
图片的大小定 义为:w * h,宽高分别为w和h 一.YUV格式 1.1.YUV420格式存储方式:先Y,后V,中间是U.其中的Y是w * h,U和V是w/2 * (h/2)举例:如果w = 4,h ...
- js动画--封装透明度
这一章我将讲述一些如何将透明度的变化也封装到调用函数中,对于前面几节课的介绍,已经将基本的属性封装到函数中了,宽,长等属性.关于透明度的变化还是有一点区别的,这一章我将封装透明度 先创建一个div & ...