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 986c927b..9c03e8d3 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 @@ -250,8 +250,14 @@ public final class JsonTreeReader extends JsonReader { } JsonElement nextJsonElement() throws IOException { - if (peek() == JsonToken.NAME) { - throw new IllegalStateException("Can't turn a name into a JsonElement"); + final JsonToken peeked = peek(); + if ( + peeked == JsonToken.NAME + || peeked == JsonToken.END_ARRAY + || peeked == JsonToken.END_OBJECT + || peeked == JsonToken.END_DOCUMENT + ) { + throw new IllegalStateException("Unexpected " + peeked + " when reading a JsonElement."); } final JsonElement element = (JsonElement) peekStack(); skipValue(); diff --git a/gson/src/test/java/com/google/gson/internal/bind/JsonElementReaderTest.java b/gson/src/test/java/com/google/gson/internal/bind/JsonElementReaderTest.java index 4c4dd8df..204fb3c3 100644 --- a/gson/src/test/java/com/google/gson/internal/bind/JsonElementReaderTest.java +++ b/gson/src/test/java/com/google/gson/internal/bind/JsonElementReaderTest.java @@ -18,6 +18,7 @@ package com.google.gson.internal.bind; import com.google.gson.JsonElement; import com.google.gson.JsonParser; +import com.google.gson.JsonPrimitive; import com.google.gson.stream.JsonToken; import java.io.IOException; import junit.framework.TestCase; @@ -298,6 +299,41 @@ public final class JsonElementReaderTest extends TestCase { reader.endArray(); } + public void testNextJsonElement() throws IOException { + final JsonElement element = JsonParser.parseString("{\"A\": 1, \"B\" : {}, \"C\" : []}"); + JsonTreeReader reader = new JsonTreeReader(element); + reader.beginObject(); + try { + reader.nextJsonElement(); + fail(); + } catch (IllegalStateException expected) { + } + reader.nextName(); + assertEquals(reader.nextJsonElement(), new JsonPrimitive(1)); + reader.nextName(); + reader.beginObject(); + try { + reader.nextJsonElement(); + fail(); + } catch (IllegalStateException expected) { + } + reader.endObject(); + reader.nextName(); + reader.beginArray(); + try { + reader.nextJsonElement(); + fail(); + } catch (IllegalStateException expected) { + } + reader.endArray(); + reader.endObject(); + try { + reader.nextJsonElement(); + fail(); + } catch (IllegalStateException expected) { + } + } + public void testEarlyClose() throws IOException { JsonElement element = JsonParser.parseString("[1, 2, 3]"); JsonTreeReader reader = new JsonTreeReader(element);