Skip to content

Commit 802bc48

Browse files
committed
Json Refactor
1 parent bdc8da0 commit 802bc48

27 files changed

Lines changed: 280 additions & 239 deletions

src/main/java/com/techatpark/sjson/core/Json.java renamed to src/main/java/com/techatpark/sjson/Json.java

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1-
package com.techatpark.sjson.core;
1+
package com.techatpark.sjson;
2+
3+
import com.techatpark.sjson.element.JsonArray;
4+
import com.techatpark.sjson.element.JsonFalse;
5+
import com.techatpark.sjson.element.JsonNull;
6+
import com.techatpark.sjson.element.JsonNumber;
7+
import com.techatpark.sjson.element.JsonObject;
8+
import com.techatpark.sjson.element.JsonString;
9+
import com.techatpark.sjson.element.JsonTrue;
210

311
import java.io.IOException;
412
import java.io.Reader;
513
import java.util.List;
614
import java.util.Map;
715
import java.util.stream.Collectors;
816

9-
import static com.techatpark.sjson.core.parser.ArrayParser.getArray;
10-
import static com.techatpark.sjson.core.parser.BooleanParser.getFalse;
11-
import static com.techatpark.sjson.core.parser.BooleanParser.getTrue;
12-
import static com.techatpark.sjson.core.parser.NullParser.getNull;
13-
import static com.techatpark.sjson.core.parser.ObjectParser.getObject;
14-
import static com.techatpark.sjson.core.parser.StringParser.getString;
15-
import static com.techatpark.sjson.core.parser.NumberParser.getNumber;
1617

1718
/**
1819
* Json parser for server side workloads.
@@ -26,8 +27,9 @@
2627
* Note:
2728
* This is not general purpose parser. This is useful for Microservices
2829
* and REST Clients where we primarily need to read/write json data.
30+
* @param <T> type of object
2931
*/
30-
public interface Json {
32+
public interface Json<T> {
3133

3234
/**
3335
* Length of Unicode.
@@ -39,6 +41,12 @@ public interface Json {
3941
*/
4042
String ILLEGAL_JSON_VALUE = "Illegal value at ";
4143

44+
/**
45+
* Reads the object value.
46+
* @return value
47+
*/
48+
T read();
49+
4250
/**
4351
* Reads JSON as a Java Object.
4452
* <p>
@@ -59,7 +67,7 @@ public interface Json {
5967
*/
6068
static Object read(final Reader reader) throws IOException {
6169
try (reader) {
62-
return new ContextExtractor(reader).parse();
70+
return new ContextExtractor(reader).parse().read();
6371
}
6472
}
6573

@@ -178,7 +186,7 @@ private static void escape(final String s, final StringBuilder sb) {
178186
* ContextExtractor is responsible to interact with underlying reader to
179187
* extract the content.
180188
*/
181-
final class ContextExtractor {
189+
final class ContextExtractor implements Json<Object> {
182190

183191
/**
184192
* Max Depth of an nested Object.
@@ -256,23 +264,23 @@ private void decrementDepth() {
256264
* @return object
257265
* @throws IOException
258266
*/
259-
public Object parse() throws IOException {
267+
public Json<?> parse() throws IOException {
260268
// 1. move to the first clean character to determine the Data type
261269
final char character = nextClean();
262270
setCursor(character);
263271
// 2. Call corresponding get methods based on the type
264272
return switch (character) {
265-
case '"' -> getString(reader, this);
266-
case 'n' -> getNull(reader, this);
267-
case 't' -> getTrue(reader, this);
268-
case 'f' -> getFalse(reader, this);
269-
case '{' -> getObject(reader, this);
270-
case '[' -> getArray(reader, this);
273+
case '"' -> new JsonString(reader, this);
274+
case 'n' -> new JsonNull(reader, this);
275+
case 't' -> new JsonTrue(reader, this);
276+
case 'f' -> new JsonFalse(reader, this);
277+
case '{' -> new JsonObject(reader, this);
278+
case '[' -> new JsonArray(reader, this);
271279
case ']' -> this;
272280
default -> {
273281
if (Character.isDigit(character)
274282
|| character == '+' || character == '-') {
275-
yield getNumber(this, reader, character);
283+
yield new JsonNumber(this, reader, character);
276284
}
277285
throw new IllegalArgumentException(ILLEGAL_JSON_VALUE);
278286
}
@@ -353,5 +361,11 @@ private boolean isSpace(final char character) {
353361
|| character == '\r'
354362
|| character == '\t');
355363
}
364+
365+
@Override
366+
public Object read() {
367+
throw new UnsupportedOperationException("Can not read Object "
368+
+ "from context extractor");
369+
}
356370
}
357371
}

src/main/java/com/techatpark/sjson/core/package-info.java

Lines changed: 0 additions & 4 deletions
This file was deleted.

src/main/java/com/techatpark/sjson/core/parser/BooleanParser.java

Lines changed: 0 additions & 72 deletions
This file was deleted.

src/main/java/com/techatpark/sjson/core/parser/NullParser.java

Lines changed: 0 additions & 48 deletions
This file was deleted.

src/main/java/com/techatpark/sjson/core/parser/ArrayParser.java renamed to src/main/java/com/techatpark/sjson/element/JsonArray.java

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,49 @@
1-
package com.techatpark.sjson.core.parser;
1+
package com.techatpark.sjson.element;
22

3-
import com.techatpark.sjson.core.Json;
3+
import com.techatpark.sjson.Json;
44

55
import java.io.IOException;
66
import java.io.Reader;
77
import java.util.ArrayList;
88
import java.util.Collections;
99
import java.util.List;
10+
import java.util.stream.Collectors;
1011

11-
public final class ArrayParser {
12+
public final class JsonArray implements Json<List<Object>> {
1213

1314
/**
14-
* util classes.
15+
* Json Elements of the Array.
1516
*/
16-
private ArrayParser() {
17-
}
17+
private final List<Json<?>> jsonElements;
1818

1919
/**
20-
* Reades an Array. Reader stops at next clean character.
20+
* Reads an Array. Reader stops at next clean character.
2121
* @param reader
2222
* @param contextExtractor
23-
* @return list
2423
* @throws IOException
2524
*/
26-
public static List<Object> getArray(final Reader reader,
27-
final Json.ContextExtractor
28-
contextExtractor) throws IOException {
25+
public JsonArray(final Reader reader,
26+
final Json.ContextExtractor
27+
contextExtractor) throws IOException {
2928
contextExtractor.startArray();
30-
final Object value = contextExtractor.parse();
29+
final Json<?> value = contextExtractor.parse();
3130
// If not Empty Array
3231
if (value == contextExtractor) {
3332
contextExtractor.setCursorToNextClean();
34-
return Collections.emptyList();
35-
}
36-
final List<Object> list = new ArrayList<>();
37-
list.add(value);
38-
while (!endOfArray(reader, contextExtractor)) {
39-
list.add(contextExtractor.parse());
33+
jsonElements = Collections.emptyList();
34+
} else {
35+
jsonElements = new ArrayList<>();
36+
jsonElements.add(value);
37+
while (!endOfArray(reader, contextExtractor)) {
38+
jsonElements.add(contextExtractor.parse());
39+
}
40+
contextExtractor.setCursorToNextClean();
4041
}
41-
contextExtractor.setCursorToNextClean();
42+
4243
contextExtractor.endArray();
43-
return list;
4444
}
45+
46+
4547
/**
4648
* Determine array close character.
4749
* @param reader
@@ -68,4 +70,10 @@ private static boolean endOfArray(final Reader reader,
6870
}
6971

7072

73+
@Override
74+
public List<Object> read() {
75+
return jsonElements
76+
.stream().map(Json::read)
77+
.collect(Collectors.toUnmodifiableList());
78+
}
7179
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.techatpark.sjson.element;
2+
3+
import com.techatpark.sjson.Json;
4+
5+
import java.io.IOException;
6+
import java.io.Reader;
7+
8+
/**
9+
* Boolean Parser.
10+
* */
11+
12+
public final class JsonFalse implements Json<Boolean> {
13+
14+
/**
15+
* This is for length.
16+
*/
17+
public static final int THREE = 3;
18+
/**
19+
* This is for length.
20+
*/
21+
public static final int FOUR = 4;
22+
23+
/**
24+
* Reads False from Reader. Reader will strip at the "e" symbol.
25+
* @param reader
26+
* @param contextExtractor
27+
* @throws IOException
28+
*/
29+
public JsonFalse(final Reader reader,
30+
final Json.ContextExtractor
31+
contextExtractor) throws IOException {
32+
char[] charBuffer = contextExtractor.next(FOUR);
33+
if (charBuffer[0] != 'a'
34+
|| charBuffer[1] != 'l'
35+
|| charBuffer[2] != 's'
36+
|| charBuffer[THREE] != 'e') {
37+
throw new IllegalArgumentException(ILLEGAL_JSON_VALUE);
38+
}
39+
}
40+
41+
@Override
42+
public Boolean read() {
43+
return Boolean.FALSE;
44+
}
45+
}

0 commit comments

Comments
 (0)