You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by st...@apache.org on 2017/10/17 20:17:25 UTC
[2/2] johnzon git commit: JOHNZON-139 improve skipArray and skipObject
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 <st...@apache.org>
Authored: Tue Oct 17 22:16:27 2017 +0200
Committer: Mark Struberg <st...@apache.org>
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