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