JOHNZON-139 improve skipArray and skipObject They both need to also work within objects.
Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/08905f99 Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/08905f99 Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/08905f99 Branch: refs/heads/master Commit: 08905f99ed0be7a8e8dc4f111e37b5e3694da476 Parents: d455dea Author: Mark Struberg <[email protected]> Authored: Tue Oct 17 22:16:27 2017 +0200 Committer: Mark Struberg <[email protected]> Committed: Tue Oct 17 22:16:27 2017 +0200 ---------------------------------------------------------------------- .../johnzon/core/JohnzonJsonParserImpl.java | 41 +++++++++++++++++--- .../apache/johnzon/core/JsonInMemoryParser.java | 12 ++++++ .../johnzon/core/JsonStreamParserImpl.java | 11 ++++++ 3 files changed, 58 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/08905f99/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java index 5caa5b0..b105e8b 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java @@ -16,6 +16,9 @@ */ package org.apache.johnzon.core; +import java.util.Map; +import java.util.stream.Stream; + import javax.json.JsonArray; import javax.json.JsonObject; import javax.json.JsonValue; @@ -26,6 +29,11 @@ import javax.json.JsonValue; */ public abstract class JohnzonJsonParserImpl implements JohnzonJsonParser { + /** + * @return {@code true} if we are currently inside an array + */ + protected abstract boolean isInArray(); + @Override public JsonObject getObject() { Event current = current(); @@ -37,6 +45,7 @@ public abstract class JohnzonJsonParserImpl implements JohnzonJsonParser { return jsonReader.readObject(); } + @Override public JsonArray getArray() { Event current = current(); @@ -61,15 +70,35 @@ public abstract class JohnzonJsonParserImpl implements JohnzonJsonParser { @Override public void skipObject() { - // could surely get improved. - // But no need for now as this method is not used that often. - getObject(); + int level = 1; + do { + Event event = next(); + if (event == Event.START_OBJECT) { + level++; + } else if (event == Event.END_OBJECT) { + level --; + } + } while (level > 0 && hasNext()); } @Override public void skipArray() { - // could surely get improved. - // But no need for now as this method is not used that often. - getArray(); + if (isInArray()) { + int level = 1; + do { + Event event = next(); + if (event == Event.START_ARRAY) { + level++; + } else if (event == Event.END_ARRAY) { + level--; + } + } while (level > 0 && hasNext()); + } + } + + + @Override + public Stream<Map.Entry<String, JsonValue>> getObjectStream() { + return null; } } http://git-wip-us.apache.org/repos/asf/johnzon/blob/08905f99/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java index 7126e62..31e767d 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java @@ -37,6 +37,7 @@ class JsonInMemoryParser extends JohnzonJsonParserImpl { private Event currentEvent; private JsonValue currentValue; + private int arrayDepth = 0; private class ArrayIterator implements Iterator<Event> { @@ -175,6 +176,11 @@ class JsonInMemoryParser extends JohnzonJsonParserImpl { return currentEvent; } + @Override + protected boolean isInArray() { + return arrayDepth > 0; + } + private static Event getEvent(final ValueType value) { switch (value) { @@ -217,6 +223,12 @@ class JsonInMemoryParser extends JohnzonJsonParserImpl { currentEvent = stack.peek().next(); + if (currentEvent == Event.START_ARRAY) { + arrayDepth++; + } else if (currentEvent == Event.END_ARRAY) { + arrayDepth--; + } + return currentEvent; } http://git-wip-us.apache.org/repos/asf/johnzon/blob/08905f99/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java index 6af101e..dc875fe 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java @@ -94,6 +94,8 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC //Stack can cause out of memory issues when the nesting depth of a Json stream is too deep. private StructureElement currentStructureElement = null; + private int arrayDepth = 0; + //minimal stack implementation private static final class StructureElement { private final StructureElement previous; @@ -516,6 +518,8 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC currentStructureElement = localStructureElement; } + arrayDepth++; + return EVT_MAP[previousEvent = START_ARRAY]; } @@ -534,9 +538,16 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC //pop from stack currentStructureElement = currentStructureElement.previous; + arrayDepth--; + return EVT_MAP[previousEvent = END_ARRAY]; } + @Override + protected boolean isInArray() { + return arrayDepth > 0; + } + //read a string, gets called recursively //Handles escape/d characters //if string contains escape chars and/or cross buffer boundary then copy in the value buffer
