diff --git a/gson/src/main/java/com/google/gson/internal/bind/JsonTreeReader.java b/gson/src/main/java/com/google/gson/internal/bind/JsonTreeReader.java index a223754a..986c927b 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/JsonTreeReader.java +++ b/gson/src/main/java/com/google/gson/internal/bind/JsonTreeReader.java @@ -249,6 +249,15 @@ public final class JsonTreeReader extends JsonReader { return result; } + JsonElement nextJsonElement() throws IOException { + if (peek() == JsonToken.NAME) { + throw new IllegalStateException("Can't turn a name into a JsonElement"); + } + final JsonElement element = (JsonElement) peekStack(); + skipValue(); + return element; + } + @Override public void close() throws IOException { stack = new Object[] { SENTINEL_CLOSED }; stackSize = 1; diff --git a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java index 6bbd680a..81dda903 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java +++ b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java @@ -677,6 +677,10 @@ public final class TypeAdapters { public static final TypeAdapter JSON_ELEMENT = new TypeAdapter() { @Override public JsonElement read(JsonReader in) throws IOException { + if (in instanceof JsonTreeReader) { + return ((JsonTreeReader) in).nextJsonElement(); + } + switch (in.peek()) { case STRING: return new JsonPrimitive(in.nextString());