Skip to content

Commit 4729185

Browse files
committed
JsonStructureParser fixes
- fix getObject() to work on root object - fix getObject() to advance parser state - fix getValue() to work on root object - fix getArray() to work on root array - fix getArray() to advance parser state - fix getValue() to work on root array
1 parent 34177db commit 4729185

File tree

2 files changed

+122
-7
lines changed

2 files changed

+122
-7
lines changed

impl/src/main/java/org/eclipse/parsson/JsonStructureParser.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import jakarta.json.*;
2020
import jakarta.json.stream.JsonLocation;
2121
import jakarta.json.stream.JsonParser;
22+
2223
import java.math.BigDecimal;
2324
import java.util.ArrayDeque;
2425
import java.util.Deque;
@@ -91,7 +92,9 @@ public BigDecimal getBigDecimal() {
9192
public JsonValue getValue() {
9293
switch (state) {
9394
case START_ARRAY:
95+
return getArray();
9496
case START_OBJECT:
97+
return getObject();
9598
case VALUE_STRING:
9699
case VALUE_NUMBER:
97100
case VALUE_TRUE:
@@ -113,7 +116,10 @@ public JsonArray getArray() {
113116
throw new IllegalStateException(
114117
JsonMessages.PARSER_GETARRAY_ERR(state));
115118
}
116-
return (JsonArray) scopeStack.peek().getJsonValue();
119+
JsonArray array = (JsonArray) current.getJsonStructure();
120+
// #transition() will pop the stack
121+
this.state = Event.END_ARRAY;
122+
return array;
117123
}
118124

119125
@Override
@@ -122,7 +128,10 @@ public JsonObject getObject() {
122128
throw new IllegalStateException(
123129
JsonMessages.PARSER_GETOBJECT_ERR(state));
124130
}
125-
return (JsonObject) scopeStack.peek().getJsonValue();
131+
JsonObject object = (JsonObject) current.getJsonStructure();
132+
// #transition() will pop the stack
133+
this.state = Event.END_OBJECT;
134+
return object;
126135
}
127136

128137
@Override
@@ -271,8 +280,19 @@ private static Event getState(JsonValue value) {
271280
}
272281

273282
private static abstract class Scope implements Iterator {
283+
284+
private final JsonStructure jsonStructure;
285+
286+
Scope(JsonStructure jsonStructure) {
287+
this.jsonStructure = jsonStructure;
288+
}
289+
274290
abstract JsonValue getJsonValue();
275291

292+
JsonStructure getJsonStructure() {
293+
return jsonStructure;
294+
}
295+
276296
static Scope createScope(JsonValue value) {
277297
if (value instanceof JsonArray) {
278298
return new ArrayScope((JsonArray)value);
@@ -288,6 +308,7 @@ private static class ArrayScope extends Scope {
288308
private JsonValue value;
289309

290310
ArrayScope(JsonArray array) {
311+
super(array);
291312
this.it = array.iterator();
292313
}
293314

@@ -320,6 +341,7 @@ private static class ObjectScope extends Scope {
320341
private String key;
321342

322343
ObjectScope(JsonObject object) {
344+
super(object);
323345
this.it = object.entrySet().iterator();
324346
}
325347

impl/src/test/java/org/eclipse/parsson/tests/JsonParserTest.java

Lines changed: 98 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -515,13 +515,13 @@ private void testGetValueStructure(JsonParser parser) {
515515
JsonValue value = parser.getValue();
516516
Assertions.assertTrue(value instanceof JsonNumber);
517517
JsonNumber number = (JsonNumber) value;
518-
assertEquals(number.longValueExact(), 1L);
518+
Assertions.assertEquals(number.longValueExact(), 1L);
519519

520520
Assertions.assertEquals(Event.VALUE_NUMBER, parser.next());
521521
value = parser.getValue();
522522
Assertions.assertTrue(value instanceof JsonNumber);
523523
number = (JsonNumber) value;
524-
assertEquals(number.bigDecimalValue(), new BigDecimal("1.1"));
524+
Assertions.assertEquals(number.bigDecimalValue(), new BigDecimal("1.1"));
525525

526526
Assertions.assertEquals(Event.VALUE_TRUE, parser.next());
527527
value = parser.getValue();
@@ -535,7 +535,7 @@ private void testGetValueStructure(JsonParser parser) {
535535
value = parser.getValue();
536536
Assertions.assertTrue(value instanceof JsonString);
537537
JsonString string = (JsonString) value;
538-
assertEquals("aString", string.getString());
538+
Assertions.assertEquals("aString", string.getString());
539539

540540
Assertions.assertEquals(Event.VALUE_NULL, parser.next());
541541
value = parser.getValue();
@@ -545,7 +545,6 @@ private void testGetValueStructure(JsonParser parser) {
545545
Assertions.assertEquals(Event.START_ARRAY, parser.next());
546546
JsonArray array = parser.getArray();
547547
Assertions.assertTrue(array.isEmpty());
548-
Assertions.assertEquals(Event.END_ARRAY, parser.next());
549548

550549
Assertions.assertEquals(Event.START_OBJECT, parser.next());
551550

@@ -595,11 +594,105 @@ private void testGetValueStructure(JsonParser parser) {
595594
JsonObject object = parser.getObject();
596595
Assertions.assertTrue(object.isEmpty());
597596
Assertions.assertEquals(Event.END_OBJECT, parser.next());
598-
Assertions.assertEquals(Event.END_OBJECT, parser.next());
599597
Assertions.assertEquals(Event.END_ARRAY, parser.next());
600598
Assertions.assertFalse(parser.hasNext());
601599
}
602600

601+
@Test
602+
void testGetArrayRoot() {
603+
try (JsonParser parser = Json.createParserFactory(null).createParser(
604+
Json.createArrayBuilder()
605+
.add(1)
606+
.add(2)
607+
.add(3)
608+
.build())) {
609+
testGetArrayRoot(parser);
610+
}
611+
}
612+
613+
private void testGetArrayRoot(JsonParser parser) {
614+
Assertions.assertEquals(Event.START_ARRAY, parser.next());
615+
JsonArray actual = parser.getArray();
616+
JsonArray expected = Json.createArrayBuilder()
617+
.add(1)
618+
.add(2)
619+
.add(3)
620+
.build();
621+
Assertions.assertEquals(expected, actual);
622+
Assertions.assertEquals(Event.END_ARRAY, parser.currentEvent());
623+
Assertions.assertFalse(parser.hasNext());
624+
}
625+
626+
@Test
627+
void testGetArrayRootByValue() {
628+
try (JsonParser parser = Json.createParserFactory(null).createParser(
629+
Json.createArrayBuilder()
630+
.add(1)
631+
.add(2)
632+
.add(3)
633+
.build())) {
634+
testGetArrayRootByValue(parser);
635+
}
636+
}
637+
638+
private void testGetArrayRootByValue(JsonParser parser) {
639+
Assertions.assertEquals(Event.START_ARRAY, parser.next());
640+
JsonValue value = parser.getValue();
641+
Assertions.assertEquals(ValueType.ARRAY, value.getValueType());
642+
JsonArray actual = (JsonArray) value;
643+
JsonArray expected = Json.createArrayBuilder()
644+
.add(1)
645+
.add(2)
646+
.add(3)
647+
.build();
648+
Assertions.assertEquals(expected, actual);
649+
Assertions.assertEquals(Event.END_ARRAY, parser.currentEvent());
650+
Assertions.assertFalse(parser.hasNext());
651+
}
652+
653+
@Test
654+
void testGetObjectRoot() {
655+
try (JsonParser parser = Json.createParserFactory(null).createParser(
656+
Json.createObjectBuilder()
657+
.add("key1", "value1")
658+
.build())) {
659+
testGetObjectRoot(parser);
660+
}
661+
}
662+
663+
private void testGetObjectRoot(JsonParser parser) {
664+
Assertions.assertEquals(Event.START_OBJECT, parser.next());
665+
JsonObject actual = parser.getObject();
666+
JsonObject expected = Json.createObjectBuilder()
667+
.add("key1", "value1")
668+
.build();
669+
Assertions.assertEquals(expected, actual);
670+
Assertions.assertEquals(Event.END_OBJECT, parser.currentEvent());
671+
Assertions.assertFalse(parser.hasNext());
672+
}
673+
674+
@Test
675+
void testGetObjectRootByValue() {
676+
try (JsonParser parser = Json.createParserFactory(null).createParser(
677+
Json.createObjectBuilder()
678+
.add("key1", "value1")
679+
.build())) {
680+
testGetObjectRootByValue(parser);
681+
}
682+
}
683+
684+
private void testGetObjectRootByValue(JsonParser parser) {
685+
Assertions.assertEquals(Event.START_OBJECT, parser.next());
686+
JsonValue value = parser.getValue();
687+
Assertions.assertEquals(ValueType.OBJECT, value.getValueType());
688+
JsonObject actual = (JsonObject) value;
689+
JsonObject expected = Json.createObjectBuilder()
690+
.add("key1", "value1")
691+
.build();
692+
Assertions.assertEquals(expected, actual);
693+
Assertions.assertEquals(Event.END_OBJECT, parser.currentEvent());
694+
Assertions.assertFalse(parser.hasNext());
695+
}
603696

604697
@Test
605698
void testNestedArrayReader() {

0 commit comments

Comments
 (0)