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