From a595032a902c0758610a1cb38379b5e91a01adbd Mon Sep 17 00:00:00 2001 From: Inderjeet Singh Date: Thu, 12 Mar 2009 01:59:48 +0000 Subject: [PATCH] Fixed issue 100 by adding support for deserialization of collections of elements that do not implement Comparable. --- .../com/google/gson/DefaultTypeAdapters.java | 15 +++++----- .../gson/functional/CollectionTest.java | 29 +++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java index c9771a87..9fd2c227 100644 --- a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java +++ b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java @@ -31,6 +31,7 @@ import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.GregorianCalendar; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -79,7 +80,7 @@ final class DefaultTypeAdapters { private static final StringTypeAdapter STRING_TYPE_ADAPTER = new StringTypeAdapter(); private static final PropertiesCreator PROPERTIES_CREATOR = new PropertiesCreator(); - private static final TreeSetCreator TREE_SET_CREATOR = new TreeSetCreator(); + private static final HashSetCreator HASH_SET_CREATOR = new HashSetCreator(); private static final GregorianCalendarTypeAdapter GREGORIAN_CALENDAR_TYPE_ADAPTER = new GregorianCalendarTypeAdapter(); @@ -178,8 +179,8 @@ final class DefaultTypeAdapters { map.register(List.class, COLLECTION_TYPE_ADAPTER); map.register(Queue.class, COLLECTION_TYPE_ADAPTER); - map.register(Set.class, TREE_SET_CREATOR); - map.register(SortedSet.class, TREE_SET_CREATOR); + map.register(Set.class, HASH_SET_CREATOR); + map.register(SortedSet.class, HASH_SET_CREATOR); map.register(Properties.class, PROPERTIES_CREATOR); map.makeUnmodifiable(); return map; @@ -779,13 +780,13 @@ final class DefaultTypeAdapters { } } - private static class TreeSetCreator implements InstanceCreator> { - public TreeSet createInstance(Type type) { - return new TreeSet(); + private static class HashSetCreator implements InstanceCreator> { + public HashSet createInstance(Type type) { + return new HashSet(); } @Override public String toString() { - return TreeSetCreator.class.getSimpleName(); + return HashSetCreator.class.getSimpleName(); } } } diff --git a/gson/src/test/java/com/google/gson/functional/CollectionTest.java b/gson/src/test/java/com/google/gson/functional/CollectionTest.java index d397b55c..a4442963 100644 --- a/gson/src/test/java/com/google/gson/functional/CollectionTest.java +++ b/gson/src/test/java/com/google/gson/functional/CollectionTest.java @@ -30,10 +30,12 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Queue; +import java.util.Set; /** * Functional tests for Json serialization and deserialization of collections. @@ -315,4 +317,31 @@ public class CollectionTest extends TestCase { return collection; } } + + private static class Entry { + int value; + Entry() { + this(10); + } + Entry(int value) { + this.value = value; + } + } + public void testSetSerialization() { + Set set = new HashSet(); + set.add(new Entry(1)); + set.add(new Entry(2)); + String json = gson.toJson(set); + assertTrue(json.contains("1")); + assertTrue(json.contains("2")); + } + public void testSetDeserialization() { + String json = "[{value:1},{value:2}]"; + Type type = new TypeToken>() {}.getType(); + Set set = gson.fromJson(json, type); + assertEquals(2, set.size()); + for (Entry entry : set) { + assertTrue(entry.value == 1 || entry.value == 2); + } + } }