diff --git a/src/main/java/com/alibaba/fastjson/serializer/CollectionCodec.java b/src/main/java/com/alibaba/fastjson/serializer/CollectionCodec.java index a9b91cc8b..95d5c3e3e 100644 --- a/src/main/java/com/alibaba/fastjson/serializer/CollectionCodec.java +++ b/src/main/java/com/alibaba/fastjson/serializer/CollectionCodec.java @@ -120,7 +120,13 @@ public class CollectionCodec implements ObjectSerializer, ObjectDeserializer { return (T) array; } - Collection list = TypeUtils.createCollection(type); + Collection list; + if (parser.lexer.token() == JSONToken.SET) { + parser.lexer.nextToken(); + list = TypeUtils.createSet(type); + } else { + list = TypeUtils.createCollection(type); + } Type itemType = TypeUtils.getCollectionItemType(type); parser.parseArray(itemType, list, fieldName); diff --git a/src/main/java/com/alibaba/fastjson/util/TypeUtils.java b/src/main/java/com/alibaba/fastjson/util/TypeUtils.java index 8125d074a..0ebad0c00 100644 --- a/src/main/java/com/alibaba/fastjson/util/TypeUtils.java +++ b/src/main/java/com/alibaba/fastjson/util/TypeUtils.java @@ -2702,6 +2702,36 @@ public class TypeUtils { return clz; } + public static Set createSet(Type type) { + Class rawClass = getRawClass(type); + Set set; + if (rawClass == AbstractCollection.class // + || rawClass == Collection.class) { + set = new HashSet(); + } else if (rawClass.isAssignableFrom(HashSet.class)) { + set = new HashSet(); + } else if (rawClass.isAssignableFrom(LinkedHashSet.class)) { + set = new LinkedHashSet(); + } else if (rawClass.isAssignableFrom(TreeSet.class)) { + set = new TreeSet(); + } else if (rawClass.isAssignableFrom(EnumSet.class)) { + Type itemType; + if (type instanceof ParameterizedType) { + itemType = ((ParameterizedType) type).getActualTypeArguments()[0]; + } else { + itemType = Object.class; + } + set = EnumSet.noneOf((Class) itemType); + } else { + try { + set = (Set) rawClass.newInstance(); + } catch (Exception e) { + throw new JSONException("create instance error, class " + rawClass.getName()); + } + } + return set; + } + @SuppressWarnings({"rawtypes", "unchecked"}) public static Collection createCollection(Type type) { Class rawClass = getRawClass(type);