From 970f08052ddc98d6f3ab8905723163ecbc6cfd09 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 9 Aug 2011 04:16:50 +0000 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84JSONFeild=E7=9A=84SerializeFe?= =?UTF-8?q?ature=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/fastjson/trunk/fastjson@1287 fb902949-7fc4-4485-a80f-4d6ff335c879 --- .../serializer/ASMSerializerFactory.java | 13 +++++- .../serializer/ObjectFieldSerializer.java | 6 +++ .../alibaba/json/test/bvt/FeaturesTest5.java | 40 +++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/alibaba/json/test/bvt/FeaturesTest5.java diff --git a/src/main/java/com/alibaba/fastjson/serializer/ASMSerializerFactory.java b/src/main/java/com/alibaba/fastjson/serializer/ASMSerializerFactory.java index a6f54d605..e4f8db780 100644 --- a/src/main/java/com/alibaba/fastjson/serializer/ASMSerializerFactory.java +++ b/src/main/java/com/alibaba/fastjson/serializer/ASMSerializerFactory.java @@ -1053,6 +1053,7 @@ public class ASMSerializerFactory implements Opcodes { boolean writeNull = false; boolean writeNullNumberAsZero = false; boolean writeNullStringAsEmpty = false; + boolean writeNullBooleanAsFalse = false; JSONField annotation = fieldInfo.getAnnotation(JSONField.class); if (annotation != null) { for (SerializerFeature feature : annotation.serialzeFeatures()) { @@ -1062,6 +1063,8 @@ public class ASMSerializerFactory implements Opcodes { writeNullNumberAsZero = true; } else if (feature == SerializerFeature.WriteNullStringAsEmpty) { writeNullStringAsEmpty = true; + } else if (feature == SerializerFeature.WriteNullBooleanAsFalse) { + writeNullBooleanAsFalse = true; } } } @@ -1100,8 +1103,14 @@ public class ASMSerializerFactory implements Opcodes { "(CLjava/lang/String;)V"); } } else if (propertyClass == Boolean.class) { - mw.visitMethodInsn(INVOKEVIRTUAL, getType(SerializeWriter.class), "writeFieldNullBoolean", - "(CLjava/lang/String;)V"); + if (writeNullBooleanAsFalse) { + mw.visitInsn(ICONST_0); + mw.visitMethodInsn(INVOKEVIRTUAL, getType(SerializeWriter.class), "writeFieldValue", + "(CLjava/lang/String;Z)V"); + } else { + mw.visitMethodInsn(INVOKEVIRTUAL, getType(SerializeWriter.class), "writeFieldNullBoolean", + "(CLjava/lang/String;)V"); + } } else if (Collection.class.isAssignableFrom(propertyClass) || propertyClass.isArray()) { mw.visitMethodInsn(INVOKEVIRTUAL, getType(SerializeWriter.class), "writeFieldNullList", "(CLjava/lang/String;)V"); diff --git a/src/main/java/com/alibaba/fastjson/serializer/ObjectFieldSerializer.java b/src/main/java/com/alibaba/fastjson/serializer/ObjectFieldSerializer.java index f8180ebfc..2f94fe9f3 100644 --- a/src/main/java/com/alibaba/fastjson/serializer/ObjectFieldSerializer.java +++ b/src/main/java/com/alibaba/fastjson/serializer/ObjectFieldSerializer.java @@ -28,6 +28,7 @@ public class ObjectFieldSerializer extends FieldSerializer { private String format; private boolean writeNumberAsZero = false; boolean writeNullStringAsEmpty = false; + boolean writeNullBooleanAsFalse = false; public ObjectFieldSerializer(FieldInfo fieldInfo) { super(fieldInfo); @@ -46,6 +47,8 @@ public class ObjectFieldSerializer extends FieldSerializer { writeNumberAsZero = true; } else if (feature == SerializerFeature.WriteNullStringAsEmpty) { writeNullStringAsEmpty = true; + } else if (feature == SerializerFeature.WriteNullBooleanAsFalse) { + writeNullBooleanAsFalse = true; } } } @@ -79,6 +82,9 @@ public class ObjectFieldSerializer extends FieldSerializer { } else if (writeNullStringAsEmpty && String.class == runtimeFieldClass) { serializer.getWriter().write("\"\""); return; + } else if (writeNullBooleanAsFalse && Boolean.class == runtimeFieldClass) { + serializer.getWriter().write("false"); + return; } fieldSerializer.write(serializer, null); diff --git a/src/test/java/com/alibaba/json/test/bvt/FeaturesTest5.java b/src/test/java/com/alibaba/json/test/bvt/FeaturesTest5.java new file mode 100644 index 000000000..0a66814b5 --- /dev/null +++ b/src/test/java/com/alibaba/json/test/bvt/FeaturesTest5.java @@ -0,0 +1,40 @@ +package com.alibaba.json.test.bvt; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.annotation.JSONField; +import com.alibaba.fastjson.serializer.SerializeConfig; +import com.alibaba.fastjson.serializer.SerializerFeature; + +public class FeaturesTest5 extends TestCase { + + public void test_0() throws Exception { + SerializeConfig config = new SerializeConfig(); + config.setAsmEnable(false); + + String text = JSON.toJSONString(new Entity(), config); + Assert.assertEquals("{\"value\":false}", text); + } + + public void test_1() throws Exception { + SerializeConfig config = new SerializeConfig(); + config.setAsmEnable(true); + + String text = JSON.toJSONString(new Entity(), config); + Assert.assertEquals("{\"value\":false}", text); + } + + public static class Entity { + + private Boolean value; + + @JSONField(serialzeFeatures = { SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullBooleanAsFalse }) + public Boolean getValue() { + return value; + } + + + } +}