Class AsyncJSON
A non-blocking JSON parser that can parse partial JSON strings.
Usage:
AsyncJSON parser = new AsyncJSON.Factory().newAsyncJSON(); // Feed the parser with partial JSON string content. parser.parse(chunk1); parser.parse(chunk2); // Tell the parser that the JSON string content // is terminated and get the JSON object back. Map<String, Object> object = parser.complete();
After the call to complete()
the parser can be reused to parse
another JSON string.
Custom objects can be created by specifying a "class"
or
"x-class"
field:
String json = """ { "x-class": "com.acme.Person", "firstName": "John", "lastName": "Doe", "age": 42 } """ parser.parse(json); com.acme.Person person = parser.complete();
Class com.acme.Person
must either implement JSON.Convertible
,
or be mapped with a JSON.Convertor
via AsyncJSON.Factory.putConvertor(String, Convertor)
.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic interface
The state of JSON parsing.static class
The factory that creates AsyncJSON instances.private static class
private static class
private static class
private static enum
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate List<ByteBuffer>
private final AsyncJSON.Factory
private final AsyncJSON.NumberBuilder
private final AsyncJSON.FrameStack
private final Utf8StringBuilder
private static final Object
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription<R> R
complete()
Signals to the parser that the parse data is complete, and returns the object parsed from the JSON chunks passed to theparse()
methods.private Object
convertObject
(String fieldName, Map<String, Object> object) private Object
convertObject
(Map<String, Object> object) private Object
end()
private byte
hexToByte
(ByteBuffer buffer, byte currentByte) (package private) boolean
isEmpty()
private static boolean
isWhitespace
(byte ws) newArray
(AsyncJSON.Context context) When a JSON[
is encountered during parsing, this method is called to create a newList
instance.protected RuntimeException
newInvalidJSON
(ByteBuffer buffer, String message) newObject
(AsyncJSON.Context context) When a JSON{
is encountered during parsing, this method is called to create a newMap
instance.boolean
parse
(byte[] bytes) Feeds the parser with the given bytes chunk.boolean
parse
(byte[] bytes, int offset, int length) Feeds the parser with the given bytes chunk.boolean
parse
(ByteBuffer buffer) Feeds the parser with the given buffer chunk.private boolean
parseAny
(ByteBuffer buffer) private boolean
parseArray
(ByteBuffer buffer) private boolean
parseEscape
(ByteBuffer buffer) private boolean
parseEscapeCharacter
(char escape) private boolean
parseFalse
(ByteBuffer buffer) private void
parseFalseCharacter
(ByteBuffer buffer, int index) private boolean
parseNull
(ByteBuffer buffer) private void
parseNullCharacter
(ByteBuffer buffer, int index) private boolean
parseNumber
(ByteBuffer buffer) private boolean
parseObject
(ByteBuffer buffer) private boolean
parseObjectField
(ByteBuffer buffer) private boolean
parseObjectFieldName
(ByteBuffer buffer) private boolean
parseObjectFieldValue
(ByteBuffer buffer) private boolean
parseString
(ByteBuffer buffer) private boolean
parseTrue
(ByteBuffer buffer) private void
parseTrueCharacter
(ByteBuffer buffer, int index) private boolean
parseUnicode
(ByteBuffer buffer) private void
reset()
private JSON.Convertible
toConvertible
(String className)
-
Field Details
-
UNSET
-
stack
-
numberBuilder
-
stringBuilder
-
factory
-
chunks
-
-
Constructor Details
-
AsyncJSON
-
-
Method Details
-
isEmpty
boolean isEmpty() -
parse
public boolean parse(byte[] bytes) Feeds the parser with the given bytes chunk.
- Parameters:
bytes
- the bytes to parse- Returns:
- whether the JSON parsing was complete
- Throws:
IllegalArgumentException
- if the JSON is malformed
-
parse
public boolean parse(byte[] bytes, int offset, int length) Feeds the parser with the given bytes chunk.
- Parameters:
bytes
- the bytes to parseoffset
- the offset to start parsing fromlength
- the number of bytes to parse- Returns:
- whether the JSON parsing was complete
- Throws:
IllegalArgumentException
- if the JSON is malformed
-
parse
Feeds the parser with the given buffer chunk.
- Parameters:
buffer
- the buffer to parse- Returns:
- whether the JSON parsing was complete
- Throws:
IllegalArgumentException
- if the JSON is malformed
-
complete
public <R> R complete()Signals to the parser that the parse data is complete, and returns the object parsed from the JSON chunks passed to the
parse()
methods.- Type Parameters:
R
- the type the result is cast to- Returns:
- the result of the JSON parsing
- Throws:
IllegalArgumentException
- if the JSON is malformedIllegalStateException
- if the no JSON was passed to theparse()
methods
-
newObject
When a JSON
{
is encountered during parsing, this method is called to create a newMap
instance.Subclasses may override to return a custom
Map
instance.- Parameters:
context
- the parsing context- Returns:
- a
Map
instance
-
newArray
When a JSON
[
is encountered during parsing, this method is called to create a newList
instance.Subclasses may override to return a custom
List
instance.- Parameters:
context
- the parsing context- Returns:
- a
List
instance
-
end
-
reset
private void reset() -
parseAny
-
parseNull
-
parseNullCharacter
-
parseTrue
-
parseTrueCharacter
-
parseFalse
-
parseFalseCharacter
-
parseNumber
-
parseString
-
parseEscape
-
parseEscapeCharacter
private boolean parseEscapeCharacter(char escape) -
parseUnicode
-
hexToByte
-
parseArray
-
parseObject
-
parseObjectField
-
parseObjectFieldName
-
parseObjectFieldValue
-
convertObject
-
convertObject
-
toConvertible
-
newInvalidJSON
-
isWhitespace
private static boolean isWhitespace(byte ws)
-