JSONRestReader#end() should skip remaining attributes/entries
If the current object has more unread attributes, or the current
array has more unread entries, JSONRestReader#end() should skip
them instead of failing with an IllegalStateException.
Change-Id: Ia132a3925a335f24063b606eb77d909dcb6b64dd
Signed-off-by: Michael Ochmann <michael.ochmann@sap.com>
diff --git a/org.eclipse.skalli.core.test/src/main/java/org/eclipse/skalli/core/rest/JSONRestReaderTest.java b/org.eclipse.skalli.core.test/src/main/java/org/eclipse/skalli/core/rest/JSONRestReaderTest.java
index b440796..53c6e4c 100644
--- a/org.eclipse.skalli.core.test/src/main/java/org/eclipse/skalli/core/rest/JSONRestReaderTest.java
+++ b/org.eclipse.skalli.core.test/src/main/java/org/eclipse/skalli/core/rest/JSONRestReaderTest.java
@@ -267,6 +267,23 @@
json.end();
}
+ @Test
+ public void testSkipUnreadObjectAttributesAtEnd() throws Exception {
+ JSONRestReader json = getRestReader("{\"a\":\"string\",\"b\":\"string\"}");
+ json.object();
+ assertEquals("a", json.key());
+ assertEquals("string", json.valueString());
+ json.end(); // must not fail!
+ }
+
+ @Test
+ public void testSkipUnreadArrayEntriesAtEnd() throws Exception {
+ JSONRestReader json = getRestReader("[\"a\",\"b\"]");
+ json.array();
+ assertEquals("a", json.valueString());
+ json.end(); // must not fail!
+ }
+
@Test(expected=IllegalStateException.class)
public void testUnexpectedEnd() throws Exception {
JSONRestReader json = getRestReader("{\"a\":\"string\"}");
diff --git a/org.eclipse.skalli.core/src/main/java/org/eclipse/skalli/core/rest/JSONRestReader.java b/org.eclipse.skalli.core/src/main/java/org/eclipse/skalli/core/rest/JSONRestReader.java
index a6f543d..36f5eed 100644
--- a/org.eclipse.skalli.core/src/main/java/org/eclipse/skalli/core/rest/JSONRestReader.java
+++ b/org.eclipse.skalli.core/src/main/java/org/eclipse/skalli/core/rest/JSONRestReader.java
@@ -351,8 +351,10 @@
}
state = states.pop();
if (state == STATE_ARRAY) {
+ skipMore();
json.endArray();
} else if (state == STATE_OBJECT) {
+ skipMore();
json.endObject();
} else if (state == STATE_INITIAL) {
throw new IllegalStateException("Still in initial state");
@@ -392,4 +394,10 @@
json.skipValue();
}
}
+
+ private void skipMore() throws IOException {
+ while (hasMore()) {
+ skip();
+ }
+ }
}