Skip to content

Commit 9d67960

Browse files
authored
Implement JsonStructureParser#getValue methods (#140)
Implement the following methods in JsonStructureParser - getValue - getArray - getObject
1 parent 7c8c244 commit 9d67960

File tree

2 files changed

+157
-0
lines changed

2 files changed

+157
-0
lines changed

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,44 @@ public BigDecimal getBigDecimal() {
8787
return getNumberValue(JsonNumber::bigDecimalValue, JsonMessages::PARSER_GETBIGDECIMAL_ERR);
8888
}
8989

90+
@Override
91+
public JsonValue getValue() {
92+
switch (state) {
93+
case START_ARRAY:
94+
case START_OBJECT:
95+
case VALUE_STRING:
96+
case VALUE_NUMBER:
97+
case VALUE_TRUE:
98+
case VALUE_FALSE:
99+
case VALUE_NULL:
100+
return current.getJsonValue();
101+
case KEY_NAME:
102+
return new JsonStringImpl(((ObjectScope)current).key);
103+
case END_ARRAY:
104+
case END_OBJECT:
105+
default:
106+
throw new IllegalStateException(JsonMessages.PARSER_GETVALUE_ERR(state));
107+
}
108+
}
109+
110+
@Override
111+
public JsonArray getArray() {
112+
if (state != Event.START_ARRAY) {
113+
throw new IllegalStateException(
114+
JsonMessages.PARSER_GETARRAY_ERR(state));
115+
}
116+
return (JsonArray) scopeStack.peek().getJsonValue();
117+
}
118+
119+
@Override
120+
public JsonObject getObject() {
121+
if (state != Event.START_OBJECT) {
122+
throw new IllegalStateException(
123+
JsonMessages.PARSER_GETOBJECT_ERR(state));
124+
}
125+
return (JsonObject) scopeStack.peek().getJsonValue();
126+
}
127+
90128
@Override
91129
public JsonLocation getLocation() {
92130
return JsonLocationImpl.UNKNOWN;

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

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.io.StringReader;
2828

2929
import jakarta.json.*;
30+
import jakarta.json.JsonValue.ValueType;
3031
import jakarta.json.stream.JsonLocation;
3132
import jakarta.json.stream.JsonParser;
3233
import jakarta.json.stream.JsonParser.Event;
@@ -506,6 +507,124 @@ static void testObjectStringValue(JsonParser parser, String name, String value)
506507
Assertions.assertEquals(value, parser.getString());
507508
}
508509

510+
@Test
511+
void testGetValueStructure() {
512+
try (JsonParser parser = Json.createParserFactory(null).createParser(
513+
Json.createArrayBuilder()
514+
.add(1)
515+
.add(new BigDecimal("1.1"))
516+
.add(true)
517+
.add(false)
518+
.add("aString")
519+
.addNull()
520+
.add(Json.createArrayBuilder().build())
521+
.add(Json.createObjectBuilder()
522+
.add("key1", 2)
523+
.add("key2", new BigDecimal("2.2"))
524+
.add("key3", true)
525+
.add("key4", false)
526+
.add("key5", "bString")
527+
.addNull("key6")
528+
.add("key7", Json.createObjectBuilder().build())
529+
.build())
530+
.build())) {
531+
testGetValueStructure(parser);
532+
}
533+
}
534+
535+
private void testGetValueStructure(JsonParser parser) {
536+
Assertions.assertEquals(Event.START_ARRAY, parser.next());
537+
538+
Assertions.assertEquals(Event.VALUE_NUMBER, parser.next());
539+
JsonValue value = parser.getValue();
540+
Assertions.assertTrue(value instanceof JsonNumber);
541+
JsonNumber number = (JsonNumber) value;
542+
assertEquals(number.longValueExact(), 1L);
543+
544+
Assertions.assertEquals(Event.VALUE_NUMBER, parser.next());
545+
value = parser.getValue();
546+
Assertions.assertTrue(value instanceof JsonNumber);
547+
number = (JsonNumber) value;
548+
assertEquals(number.bigDecimalValue(), new BigDecimal("1.1"));
549+
550+
Assertions.assertEquals(Event.VALUE_TRUE, parser.next());
551+
value = parser.getValue();
552+
Assertions.assertSame(ValueType.TRUE, value.getValueType());
553+
554+
Assertions.assertEquals(Event.VALUE_FALSE, parser.next());
555+
value = parser.getValue();
556+
Assertions.assertSame(ValueType.FALSE, value.getValueType());
557+
558+
Assertions.assertEquals(Event.VALUE_STRING, parser.next());
559+
value = parser.getValue();
560+
Assertions.assertTrue(value instanceof JsonString);
561+
JsonString string = (JsonString) value;
562+
assertEquals("aString", string.getString());
563+
564+
Assertions.assertEquals(Event.VALUE_NULL, parser.next());
565+
value = parser.getValue();
566+
567+
Assertions.assertSame(ValueType.NULL, value.getValueType());
568+
569+
Assertions.assertEquals(Event.START_ARRAY, parser.next());
570+
JsonArray array = parser.getArray();
571+
Assertions.assertTrue(array.isEmpty());
572+
Assertions.assertEquals(Event.END_ARRAY, parser.next());
573+
574+
Assertions.assertEquals(Event.START_OBJECT, parser.next());
575+
576+
Assertions.assertEquals(Event.KEY_NAME, parser.next());
577+
value = parser.getValue();
578+
Assertions.assertTrue(value instanceof JsonString);
579+
string = (JsonString) value;
580+
Assertions.assertEquals("key1", string.getString());
581+
582+
Assertions.assertEquals(Event.VALUE_NUMBER, parser.next());
583+
value = parser.getValue();
584+
Assertions.assertTrue(value instanceof JsonNumber);
585+
number = (JsonNumber) value;
586+
Assertions.assertEquals(number.longValueExact(), 2L);
587+
588+
Assertions.assertEquals(Event.KEY_NAME, parser.next());
589+
Assertions.assertEquals(Event.VALUE_NUMBER, parser.next());
590+
value = parser.getValue();
591+
Assertions.assertTrue(value instanceof JsonNumber);
592+
number = (JsonNumber) value;
593+
Assertions.assertEquals(number.bigDecimalValue(), new BigDecimal("2.2"));
594+
595+
Assertions.assertEquals(Event.KEY_NAME, parser.next());
596+
Assertions.assertEquals(Event.VALUE_TRUE, parser.next());
597+
value = parser.getValue();
598+
Assertions.assertSame(ValueType.TRUE, value.getValueType());
599+
600+
Assertions.assertEquals(Event.KEY_NAME, parser.next());
601+
Assertions.assertEquals(Event.VALUE_FALSE, parser.next());
602+
value = parser.getValue();
603+
Assertions.assertSame(ValueType.FALSE, value.getValueType());
604+
605+
Assertions.assertEquals(Event.KEY_NAME, parser.next());
606+
Assertions.assertEquals(Event.VALUE_STRING, parser.next());
607+
value = parser.getValue();
608+
Assertions.assertTrue(value instanceof JsonString);
609+
string = (JsonString) value;
610+
Assertions.assertEquals("bString", string.getString());
611+
612+
Assertions.assertEquals(Event.KEY_NAME, parser.next());
613+
Assertions.assertEquals(Event.VALUE_NULL, parser.next());
614+
value = parser.getValue();
615+
Assertions.assertSame(ValueType.NULL, value.getValueType());
616+
617+
Assertions.assertEquals(Event.KEY_NAME, parser.next());
618+
Assertions.assertEquals(Event.START_OBJECT, parser.next());
619+
JsonObject object = parser.getObject();
620+
Assertions.assertTrue(object.isEmpty());
621+
Assertions.assertEquals(Event.END_OBJECT, parser.next());
622+
Assertions.assertEquals(Event.END_OBJECT, parser.next());
623+
Assertions.assertEquals(Event.END_ARRAY, parser.next());
624+
Assertions.assertFalse(parser.hasNext());
625+
}
626+
627+
509628
@Test
510629
void testNestedArrayReader() {
511630
try (JsonParser parser = Json.createParser(new StringReader("[[],[[]]]"))) {

0 commit comments

Comments
 (0)