diff --git a/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java b/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java index 2f312cc6b8..bacc821cff 100755 --- a/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java +++ b/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java @@ -292,10 +292,17 @@ public final Object parseObject(final Map object, Object fieldName) { lexer.resetStringPosition(); - if (key == JSON.DEFAULT_TYPE_KEY && !lexer.isEnabled(Feature.DisableSpecialKeyDetect)) { + if (key == JSON.DEFAULT_TYPE_KEY + && !lexer.isEnabled(Feature.DisableSpecialKeyDetect)) { String typeName = lexer.scanSymbol(symbolTable, '"'); + + if (lexer.isEnabled(Feature.IgnoreAutoType)) { + continue; + } + Class clazz = null; - if (object != null && object.getClass().getName().equals(typeName)) { + if (object != null + && object.getClass().getName().equals(typeName)) { clazz = object.getClass(); } else { clazz = config.checkAutoType(typeName, null); diff --git a/src/main/java/com/alibaba/fastjson/serializer/CollectionCodec.java b/src/main/java/com/alibaba/fastjson/serializer/CollectionCodec.java index c8ae85e3fd..0e3bd278e6 100755 --- a/src/main/java/com/alibaba/fastjson/serializer/CollectionCodec.java +++ b/src/main/java/com/alibaba/fastjson/serializer/CollectionCodec.java @@ -45,7 +45,9 @@ public void write(JSONSerializer serializer, Object object, Object fieldName, Ty } Type elementType = null; - if (out.isEnabled(SerializerFeature.WriteClassName)) { + if (out.isEnabled(SerializerFeature.WriteClassName) + || SerializerFeature.isEnabled(features, SerializerFeature.WriteClassName)) + { elementType = TypeUtils.getCollectionItemType(fieldType); } diff --git a/src/main/java/com/alibaba/fastjson/serializer/JavaBeanSerializer.java b/src/main/java/com/alibaba/fastjson/serializer/JavaBeanSerializer.java index 9a6b09b0f1..05f74f65af 100644 --- a/src/main/java/com/alibaba/fastjson/serializer/JavaBeanSerializer.java +++ b/src/main/java/com/alibaba/fastjson/serializer/JavaBeanSerializer.java @@ -19,6 +19,7 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Type; +import java.lang.reflect.WildcardType; import java.util.*; import com.alibaba.fastjson.JSONException; @@ -170,7 +171,15 @@ protected void write(JSONSerializer serializer, // ||(features & SerializerFeature.WriteClassName.mask) != 0 || serializer.isWriteClassName(fieldType, object)) { Class objClass = object.getClass(); - if (objClass != fieldType) { + + final Type type; + if (objClass != fieldType && fieldType instanceof WildcardType) { + type = TypeUtils.getClass(fieldType); + } else { + type = fieldType; + } + + if (objClass != type) { writeClassName(serializer, beanInfo.typeKey, object); commaFlag = true; } diff --git a/src/main/java/com/alibaba/fastjson/serializer/ListSerializer.java b/src/main/java/com/alibaba/fastjson/serializer/ListSerializer.java index 3fa3d52852..aa758ac1a6 100644 --- a/src/main/java/com/alibaba/fastjson/serializer/ListSerializer.java +++ b/src/main/java/com/alibaba/fastjson/serializer/ListSerializer.java @@ -33,7 +33,8 @@ public final class ListSerializer implements ObjectSerializer { public final void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { - boolean writeClassName = serializer.out.isEnabled(SerializerFeature.WriteClassName); + boolean writeClassName = serializer.out.isEnabled(SerializerFeature.WriteClassName) + || SerializerFeature.isEnabled(features, SerializerFeature.WriteClassName); SerializeWriter out = serializer.out; diff --git a/src/main/java/com/alibaba/fastjson/serializer/MapSerializer.java b/src/main/java/com/alibaba/fastjson/serializer/MapSerializer.java index 34f5be7d08..f5a8725477 100755 --- a/src/main/java/com/alibaba/fastjson/serializer/MapSerializer.java +++ b/src/main/java/com/alibaba/fastjson/serializer/MapSerializer.java @@ -16,6 +16,7 @@ package com.alibaba.fastjson.serializer; import java.io.IOException; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.*; @@ -250,8 +251,17 @@ public void write(JSONSerializer serializer if (SerializerFeature.isEnabled(features, SerializerFeature.WriteClassName) && preWriter instanceof JavaBeanSerializer) { + Type valueType = null; + if (fieldType instanceof ParameterizedType) { + ParameterizedType parameterizedType = (ParameterizedType) fieldType; + Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); + if (actualTypeArguments.length == 2) { + valueType = actualTypeArguments[1]; + } + } + JavaBeanSerializer javaBeanSerializer = (JavaBeanSerializer) preWriter; - javaBeanSerializer.writeNoneASM(serializer, value, entryKey, null, features); + javaBeanSerializer.writeNoneASM(serializer, value, entryKey, valueType, features); } else { preWriter.write(serializer, value, entryKey, null, features); } diff --git a/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest_List3.java b/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest_List3.java index 0910f35e9b..ff6f84dfbf 100755 --- a/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest_List3.java +++ b/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest_List3.java @@ -16,10 +16,11 @@ public void test_list() throws Exception { Model model = new Model(); List tables = new ArrayList(); tables.add(new ExtTable(1001)); + tables.add(new Table()); model.setTables(tables); String json = JSON.toJSONString(model); - assertEquals("{\"tables\":[{\"@type\":\"com.alibaba.json.bvt.writeClassName.WriteClassNameTest_List3$ExtTable\",\"id\":1001}]}", json); + assertEquals("{\"tables\":[{\"@type\":\"com.alibaba.json.bvt.writeClassName.WriteClassNameTest_List3$ExtTable\",\"id\":1001},{}]}", json); Model model2 = JSON.parseObject(json, Model.class); assertEquals(ExtTable.class, model2.getTables().iterator().next().getClass()); diff --git a/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest_Map.java b/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest_Map.java index 52bee04afe..231d965c0e 100755 --- a/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest_Map.java +++ b/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest_Map.java @@ -1,28 +1,31 @@ package com.alibaba.json.bvt.writeClassName; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONType; +import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import junit.framework.TestCase; import org.junit.Assert; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.Map; +import java.util.*; public class WriteClassNameTest_Map extends TestCase { public void test_list() throws Exception { Model model = new Model(); - Map tables = new HashMap(); + Map tables = new LinkedHashMap(); tables.put("1001", new ExtTable(1001)); + tables.put("1002", new Table()); model.setTables(tables); String json = JSON.toJSONString(model); - assertEquals("{\"tables\":{\"1001\":{\"@type\":\"com.alibaba.json.bvt.writeClassName.WriteClassNameTest_Map$ExtTable\",\"id\":1001}}}", json); + assertEquals("{\"tables\":{\"1001\":{\"@type\":\"com.alibaba.json.bvt.writeClassName.WriteClassNameTest_Map$ExtTable\",\"id\":1001},\"1002\":{}}}", json); + + JSONObject jsonObject = JSON.parseObject(json, Feature.IgnoreAutoType); + assertEquals("{\"tables\":{\"1002\":{},\"1001\":{\"id\":1001}}}", jsonObject.toJSONString()); Model model2 = JSON.parseObject(json, Model.class); assertEquals(ExtTable.class, model2.getTables().get("1001").getClass()); diff --git a/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest_Set5.java b/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest_Set5.java index 0fd3b8f38e..f082ff00a2 100755 --- a/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest_Set5.java +++ b/src/test/java/com/alibaba/json/bvt/writeClassName/WriteClassNameTest_Set5.java @@ -1,39 +1,42 @@ package com.alibaba.json.bvt.writeClassName; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; +import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.serializer.SerializerFeature; import junit.framework.TestCase; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; public class WriteClassNameTest_Set5 extends TestCase { public void test_list() throws Exception { Model model = new Model(); - Set tables = new HashSet(); + LinkedHashSet tables = new LinkedHashSet(); tables.add(new ExtTable(1001)); + tables.add(new Table()); model.setTables(tables); String json = JSON.toJSONString(model); - assertEquals("{\"tables\":[{\"@type\":\"com.alibaba.json.bvt.writeClassName.WriteClassNameTest_Set5$ExtTable\",\"id\":1001}]}", json); + assertEquals("{\"tables\":[{\"@type\":\"com.alibaba.json.bvt.writeClassName.WriteClassNameTest_Set5$ExtTable\",\"id\":1001},{}]}", json); Model model2 = JSON.parseObject(json, Model.class); assertEquals(ExtTable.class, model2.getTables().iterator().next().getClass()); + + JSONObject jsonObject = JSON.parseObject(json, Feature.IgnoreAutoType); + assertEquals("{\"tables\":[{\"id\":1001},{}]}", jsonObject.toJSONString()); } public static class Model { @JSONField(serialzeFeatures = SerializerFeature.WriteClassName) - private Set tables; + private LinkedHashSet tables; - public Set getTables() { + public LinkedHashSet getTables() { return tables; } - public void setTables(Set tables) { + public void setTables(LinkedHashSet tables) { this.tables = tables; } }