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:24 UTC

[1/2] johnzon git commit: JOHNZON-139 add skipObject and skipArray support

Repository: johnzon
Updated Branches:
  refs/heads/master 05effff6e -> 08905f99e


JOHNZON-139 add skipObject and skipArray support


Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/d455deaf
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/d455deaf
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/d455deaf

Branch: refs/heads/master
Commit: d455deafbf01675b5c607a8241adfde56ea11a6f
Parents: 05effff
Author: Mark Struberg <st...@apache.org>
Authored: Tue Oct 17 09:02:03 2017 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Tue Oct 17 09:02:03 2017 +0200

----------------------------------------------------------------------
 .../johnzon/core/JohnzonJsonParserImpl.java     | 14 ++++
 .../org/apache/johnzon/core/JsonParserTest.java | 86 ++++++++++++++++++++
 2 files changed, 100 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/d455deaf/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 5feb3d9..5caa5b0 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
@@ -58,4 +58,18 @@ public abstract class JohnzonJsonParserImpl implements JohnzonJsonParser {
         JsonReaderImpl jsonReader = new JsonReaderImpl(this, true);
         return jsonReader.readValue();
     }
+
+    @Override
+    public void skipObject() {
+        // could surely get improved.
+        // But no need for now as this method is not used that often.
+        getObject();
+    }
+
+    @Override
+    public void skipArray() {
+        // could surely get improved.
+        // But no need for now as this method is not used that often.
+        getArray();
+    }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/d455deaf/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
index 6d57e26..0a6e975 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
@@ -270,6 +270,92 @@ public class JsonParserTest {
     }
     
     @Test
+    public void testSkipObject() {
+        final JsonParser parser = Json.createParser(new StringReader("{\"a\":{\"x\":1,\"y\":{\"y1\":2}}, \"b\":3}"));
+        assertNotNull(parser);
+
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.START_OBJECT, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("a", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.START_OBJECT, event);
+        }
+
+        parser.skipObject();
+
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("b", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(Event.VALUE_NUMBER, event);
+            assertEquals(3, parser.getInt());
+        }
+    }
+
+    @Test
+    public void testSkipArray() {
+        final JsonParser parser = Json.createParser(new StringReader("{\"a\":[\"x\",\"y\"], \"b\":3}"));
+        assertNotNull(parser);
+
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.START_OBJECT, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("a", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(Event.START_ARRAY, event);
+        }
+
+        parser.skipArray();
+
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("b", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(Event.VALUE_NUMBER, event);
+            assertEquals(3, parser.getInt());
+        }
+    }
+
+    @Test
     public void simpleUTF16LE() {
         final JsonParser parser = Json.createParserFactory(null).createParser(Thread.currentThread()
                 .getContextClassLoader().getResourceAsStream("json/simple_utf16le.json"), UTF_16LE);


[2/2] johnzon git commit: JOHNZON-139 improve skipArray and skipObject

Posted by st...@apache.org.
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