fastjsonWriteClassName,Double类型不打3.3D

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

fastjsonWriteClassName,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('0');
} else {
out.writeNull();
}
return;
}
out.append(value.toString());
}
}
}
main:
JSON.toJSONString(user, new SerializeConfigX(),
SerializerFeature.WriteClassName, SerializerFeature.DisableCircularReferenceDetect);。

相关文档
最新文档