diff --git a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java index 64ca6fbe..22a154fe 100644 --- a/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java +++ b/gson/src/main/java/com/google/gson/DefaultTypeAdapters.java @@ -87,6 +87,10 @@ final class DefaultTypeAdapters { private static final NumberTypeAdapter NUMBER_TYPE_ADAPTER = new NumberTypeAdapter(); private static final ShortTypeAdapter SHORT_TYPE_ADAPTER = new ShortTypeAdapter(); private static final StringTypeAdapter STRING_TYPE_ADAPTER = new StringTypeAdapter(); + private static final StringBuilderTypeAdapter STRING_BUILDER_TYPE_ADAPTER = + new StringBuilderTypeAdapter(); + private static final StringBufferTypeAdapter STRING_BUFFER_TYPE_ADAPTER = + new StringBufferTypeAdapter(); private static final PropertiesCreator PROPERTIES_CREATOR = new PropertiesCreator(); private static final TreeSetCreator TREE_SET_CREATOR = new TreeSetCreator(); @@ -138,6 +142,8 @@ final class DefaultTypeAdapters { map.register(Short.class, SHORT_TYPE_ADAPTER); map.register(short.class, SHORT_TYPE_ADAPTER); map.register(String.class, STRING_TYPE_ADAPTER); + map.register(StringBuilder.class, STRING_BUILDER_TYPE_ADAPTER); + map.register(StringBuffer.class, STRING_BUFFER_TYPE_ADAPTER); map.makeUnmodifiable(); return map; @@ -189,6 +195,8 @@ final class DefaultTypeAdapters { map.register(Short.class, wrapDeserializer(SHORT_TYPE_ADAPTER)); map.register(short.class, wrapDeserializer(SHORT_TYPE_ADAPTER)); map.register(String.class, wrapDeserializer(STRING_TYPE_ADAPTER)); + map.register(StringBuilder.class, wrapDeserializer(STRING_BUILDER_TYPE_ADAPTER)); + map.register(StringBuffer.class, wrapDeserializer(STRING_BUFFER_TYPE_ADAPTER)); map.makeUnmodifiable(); return map; @@ -912,6 +920,40 @@ final class DefaultTypeAdapters { } } + private static class StringBuilderTypeAdapter + implements JsonSerializer, JsonDeserializer { + public JsonElement serialize(StringBuilder src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(src.toString()); + } + + public StringBuilder deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + return new StringBuilder(json.getAsString()); + } + + @Override + public String toString() { + return StringBuilderTypeAdapter.class.getSimpleName(); + } + } + + private static class StringBufferTypeAdapter + implements JsonSerializer, JsonDeserializer { + public JsonElement serialize(StringBuffer src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(src.toString()); + } + + public StringBuffer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + return new StringBuffer(json.getAsString()); + } + + @Override + public String toString() { + return StringBufferTypeAdapter.class.getSimpleName(); + } + } + private static class BooleanTypeAdapter implements JsonSerializer, JsonDeserializer { public JsonElement serialize(Boolean src, Type typeOfSrc, JsonSerializationContext context) { diff --git a/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java b/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java index 097b8684..e9312eea 100644 --- a/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java +++ b/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java @@ -429,4 +429,26 @@ public class DefaultTypeAdaptersTest extends TestCase { TreeSet treeSet = gson.fromJson(json, type); assertTrue(treeSet.contains("Value1")); } + + public void testStringBuilderSerialization() { + StringBuilder sb = new StringBuilder("abc"); + String json = gson.toJson(sb); + assertEquals("\"abc\"", json); + } + + public void testStringBuilderDeserialization() { + StringBuilder sb = gson.fromJson("'abc'", StringBuilder.class); + assertEquals("abc", sb.toString()); + } + + public void testStringBufferSerialization() { + StringBuffer sb = new StringBuffer("abc"); + String json = gson.toJson(sb); + assertEquals("\"abc\"", json); + } + + public void testStringBufferDeserialization() { + StringBuffer sb = gson.fromJson("'abc'", StringBuffer.class); + assertEquals("abc", sb.toString()); + } }