Class AsyncJSON


  • public class AsyncJSON
    extends java.lang.Object

    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).

    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      <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.
      private java.lang.Object convertObject​(java.lang.String fieldName, java.util.Map<java.lang.String,​java.lang.Object> object)  
      private java.lang.Object convertObject​(java.util.Map<java.lang.String,​java.lang.Object> object)  
      private java.lang.Object end()  
      private byte hexToByte​(java.nio.ByteBuffer buffer, byte currentByte)  
      (package private) boolean isEmpty()  
      private static boolean isWhitespace​(byte ws)  
      protected java.util.List<java.lang.Object> newArray​(AsyncJSON.Context context)
      When a JSON [ is encountered during parsing, this method is called to create a new List instance.
      protected java.lang.RuntimeException newInvalidJSON​(java.nio.ByteBuffer buffer, java.lang.String message)  
      protected java.util.Map<java.lang.String,​java.lang.Object> newObject​(AsyncJSON.Context context)
      When a JSON { is encountered during parsing, this method is called to create a new Map 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​(java.nio.ByteBuffer buffer)
      Feeds the parser with the given buffer chunk.
      private boolean parseAny​(java.nio.ByteBuffer buffer)  
      private boolean parseArray​(java.nio.ByteBuffer buffer)  
      private boolean parseEscape​(java.nio.ByteBuffer buffer)  
      private boolean parseEscapeCharacter​(char escape)  
      private boolean parseFalse​(java.nio.ByteBuffer buffer)  
      private void parseFalseCharacter​(java.nio.ByteBuffer buffer, int index)  
      private boolean parseNull​(java.nio.ByteBuffer buffer)  
      private void parseNullCharacter​(java.nio.ByteBuffer buffer, int index)  
      private boolean parseNumber​(java.nio.ByteBuffer buffer)  
      private boolean parseObject​(java.nio.ByteBuffer buffer)  
      private boolean parseObjectField​(java.nio.ByteBuffer buffer)  
      private boolean parseObjectFieldName​(java.nio.ByteBuffer buffer)  
      private boolean parseObjectFieldValue​(java.nio.ByteBuffer buffer)  
      private boolean parseString​(java.nio.ByteBuffer buffer)  
      private boolean parseTrue​(java.nio.ByteBuffer buffer)  
      private void parseTrueCharacter​(java.nio.ByteBuffer buffer, int index)  
      private boolean parseUnicode​(java.nio.ByteBuffer buffer)  
      private void reset()  
      private JSON.Convertible toConvertible​(java.lang.String className)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Method Detail

      • 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:
        java.lang.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 parse
        offset - the offset to start parsing from
        length - the number of bytes to parse
        Returns:
        whether the JSON parsing was complete
        Throws:
        java.lang.IllegalArgumentException - if the JSON is malformed
      • parse

        public boolean parse​(java.nio.ByteBuffer buffer)

        Feeds the parser with the given buffer chunk.

        Parameters:
        buffer - the buffer to parse
        Returns:
        whether the JSON parsing was complete
        Throws:
        java.lang.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:
        java.lang.IllegalArgumentException - if the JSON is malformed
        java.lang.IllegalStateException - if the no JSON was passed to the parse() methods
      • newObject

        protected java.util.Map<java.lang.String,​java.lang.Object> newObject​(AsyncJSON.Context context)

        When a JSON { is encountered during parsing, this method is called to create a new Map instance.

        Subclasses may override to return a custom Map instance.

        Parameters:
        context - the parsing context
        Returns:
        a Map instance
      • newArray

        protected java.util.List<java.lang.Object> newArray​(AsyncJSON.Context context)

        When a JSON [ is encountered during parsing, this method is called to create a new List instance.

        Subclasses may override to return a custom List instance.

        Parameters:
        context - the parsing context
        Returns:
        a List instance
      • end

        private java.lang.Object end()
      • reset

        private void reset()
      • parseAny

        private boolean parseAny​(java.nio.ByteBuffer buffer)
      • parseNull

        private boolean parseNull​(java.nio.ByteBuffer buffer)
      • parseNullCharacter

        private void parseNullCharacter​(java.nio.ByteBuffer buffer,
                                        int index)
      • parseTrue

        private boolean parseTrue​(java.nio.ByteBuffer buffer)
      • parseTrueCharacter

        private void parseTrueCharacter​(java.nio.ByteBuffer buffer,
                                        int index)
      • parseFalse

        private boolean parseFalse​(java.nio.ByteBuffer buffer)
      • parseFalseCharacter

        private void parseFalseCharacter​(java.nio.ByteBuffer buffer,
                                         int index)
      • parseNumber

        private boolean parseNumber​(java.nio.ByteBuffer buffer)
      • parseString

        private boolean parseString​(java.nio.ByteBuffer buffer)
      • parseEscape

        private boolean parseEscape​(java.nio.ByteBuffer buffer)
      • parseEscapeCharacter

        private boolean parseEscapeCharacter​(char escape)
      • parseUnicode

        private boolean parseUnicode​(java.nio.ByteBuffer buffer)
      • hexToByte

        private byte hexToByte​(java.nio.ByteBuffer buffer,
                               byte currentByte)
      • parseArray

        private boolean parseArray​(java.nio.ByteBuffer buffer)
      • parseObject

        private boolean parseObject​(java.nio.ByteBuffer buffer)
      • parseObjectField

        private boolean parseObjectField​(java.nio.ByteBuffer buffer)
      • parseObjectFieldName

        private boolean parseObjectFieldName​(java.nio.ByteBuffer buffer)
      • parseObjectFieldValue

        private boolean parseObjectFieldValue​(java.nio.ByteBuffer buffer)
      • convertObject

        private java.lang.Object convertObject​(java.util.Map<java.lang.String,​java.lang.Object> object)
      • convertObject

        private java.lang.Object convertObject​(java.lang.String fieldName,
                                               java.util.Map<java.lang.String,​java.lang.Object> object)
      • toConvertible

        private JSON.Convertible toConvertible​(java.lang.String className)
      • newInvalidJSON

        protected java.lang.RuntimeException newInvalidJSON​(java.nio.ByteBuffer buffer,
                                                            java.lang.String message)
      • isWhitespace

        private static boolean isWhitespace​(byte ws)