All Implemented Interfaces:
TreeNode, JsonSerializable, Serializable, Iterable<JsonNode>
Direct Known Subclasses:
ContainerNode, ValueNode

public abstract class BaseJsonNode extends JsonNode implements Serializable
Abstract base class common to all standard JsonNode implementations. The main addition here is that we declare that sub-classes must implement JsonSerializable. This simplifies object mapping aspects a bit, as no external serializers are needed.

Since 2.10, all implements have been Serializable.

See Also:
  • Constructor Details

    • BaseJsonNode

      protected BaseJsonNode()
  • Method Details

    • findPath

      public final JsonNode findPath(String fieldName)
      Description copied from class: JsonNode
      Method similar to JsonNode.findValue(java.lang.String), but that will return a "missing node" instead of null if no field is found. Missing node is a specific kind of node for which JsonNode.isMissingNode() returns true; and all value access methods return empty or missing value.
      Specified by:
      findPath in class JsonNode
      Parameters:
      fieldName - Name of field to look for
      Returns:
      Value of first matching node found; or if not found, a "missing node" (non-null instance that has no value)
    • hashCode

      public abstract int hashCode()
      Overrides:
      hashCode in class Object
    • required

      public JsonNode required(String fieldName)
      Description copied from class: JsonNode
      Method is functionally equivalent to path(fieldName).required() and can be used to check that this node is an ObjectNode (that is, represents JSON Object value) and has value for specified property with key fieldName (but note that value may be explicit JSON null value). If this node is Object Node and has value for specified property, matching value is returned; otherwise IllegalArgumentException is thrown.
      Overrides:
      required in class JsonNode
      Parameters:
      fieldName - Name of property to access
      Returns:
      Value of the specified property of this Object node
    • required

      public JsonNode required(int index)
      Description copied from class: JsonNode
      Method is functionally equivalent to path(index).required() and can be used to check that this node is an ArrayNode (that is, represents JSON Array value) and has value for specified index (but note that value may be explicit JSON null value). If this node is Array Node and has value for specified index, value at index is returned; otherwise IllegalArgumentException is thrown.
      Overrides:
      required in class JsonNode
      Parameters:
      index - Index of the value of this Array node to access
      Returns:
      Value at specified index of this Array node
    • traverse

      public JsonParser traverse()
      Description copied from interface: TreeNode
      Method for constructing a JsonParser instance for iterating over contents of the tree that this node is root of. Functionally equivalent to first serializing tree using ObjectCodec and then re-parsing but more efficient.

      NOTE: constructed parser instance will NOT initially point to a token, so before passing it to deserializers, it is typically necessary to advance it to the first available token by calling JsonParser.nextToken().

      Also note that calling this method will NOT pass ObjectCodec reference, so data-binding callback methods like JsonParser.readValueAs(Class) will not work with calling JsonParser.setCodec(edu.internet2.middleware.grouperClientExt.com.fasterxml.jackson.core.ObjectCodec)). It is often better to call TreeNode.traverse(ObjectCodec) to pass the codec explicitly.

      Specified by:
      traverse in interface TreeNode
      Returns:
      JsonParser that will stream over contents of this node
    • traverse

      public JsonParser traverse(ObjectCodec codec)
      Description copied from interface: TreeNode
      Same as TreeNode.traverse(), but additionally passes ObjectCodec to use if JsonParser.readValueAs(Class) is used (otherwise caller must call JsonParser.setCodec(edu.internet2.middleware.grouperClientExt.com.fasterxml.jackson.core.ObjectCodec) on response explicitly).

      NOTE: constructed parser instance will NOT initially point to a token, so before passing it to deserializers, it is typically necessary to advance it to the first available token by calling JsonParser.nextToken().

      Specified by:
      traverse in interface TreeNode
      Parameters:
      codec - ObjectCodec to associate with parser constructed
      Returns:
      JsonParser that will stream over contents of this node
    • asToken

      public abstract JsonToken asToken()
      Method that can be used for efficient type detection when using stream abstraction for traversing nodes. Will return the first JsonToken that equivalent stream event would produce (for most nodes there is just one token but for structured/container types multiple)
      Specified by:
      asToken in interface TreeNode
      Returns:
      JsonToken that is most closely associated with the node type
    • numberType

      public JsonParser.NumberType numberType()
      Returns code that identifies type of underlying numeric value, if (and only if) node is a number node.
      Specified by:
      numberType in interface TreeNode
      Returns:
      Type of number contained, if any; or null if node does not contain numeric value.
    • withObject

      public ObjectNode withObject(JsonPointer ptr, JsonNode.OverwriteMode overwriteMode, boolean preferIndex)
      Description copied from class: JsonNode
      Method that can be called on Object or Array nodes, to access a Object-valued node pointed to by given JsonPointer, if such a node exists: or if not, an attempt is made to create one and return it. For example, on document
        { "a" : {
             "b" : {
                "c" : 13
             }
          }
        }
      
      calling method with JsonPointer of /a/b would return ObjectNode
        { "c" : 13 }
      

      In cases where path leads to "missing" nodes, a path is created. So, for example, on above document, and JsonPointer of /a/x an empty ObjectNode would be returned and the document would look like:

        { "a" : {
             "b" : {
                "c" : 13
             },
             "x" : { }
          }
        }
      
      Finally, if the path is incompatible with the document -- there is an existing JsonNode through which expression cannot go -- a replacement is attempted if (and only if) conversion is allowed as per overwriteMode passed in. For example, with above document and expression of /a/b/c, conversion is allowed if passing OverwriteMode.SCALARS or OvewriteMode.ALL, and resulting document would look like:
        { "a" : {
             "b" : {
                "c" : { }
             },
             "x" : { }
          }
        }
      
      but if different modes (NONE or NULLS) is passed, an exception is thrown instead.
      Overrides:
      withObject in class JsonNode
      Parameters:
      ptr - Pointer that indicates path to use for ObjectNode value to return (potentially creating one as necessary)
      overwriteMode - Defines which node types may be converted in case of incompatible JsonPointer expression: if conversion not allowed, UnsupportedOperationException is thrown.
      preferIndex - When creating a path (for empty or replacement), and path contains segment that may be an array index (simple integer number like 3), whether to construct an ArrayNode (true) or ObjectNode (false). In latter case matching property with quoted number (like "3") is used within Object.
      Returns:
      ObjectNode found or created
    • _withObject

      protected ObjectNode _withObject(JsonPointer origPtr, JsonPointer currentPtr, JsonNode.OverwriteMode overwriteMode, boolean preferIndex)
    • _withXxxVerifyReplace

      protected void _withXxxVerifyReplace(JsonPointer origPtr, JsonPointer currentPtr, JsonNode.OverwriteMode overwriteMode, boolean preferIndex, JsonNode toReplace)
    • _withXxxMayReplace

      protected boolean _withXxxMayReplace(JsonNode node, JsonNode.OverwriteMode overwriteMode)
    • withArray

      public ArrayNode withArray(JsonPointer ptr, JsonNode.OverwriteMode overwriteMode, boolean preferIndex)
      Description copied from class: JsonNode
      Method that can be called on Object or Array nodes, to access a Array-valued node pointed to by given JsonPointer, if such a node exists: or if not, an attempt is made to create one and return it. For example, on document
        { "a" : {
             "b" : [ 1, 2 ]
          }
        }
      
      calling method with JsonPointer of /a/b would return Array
        [ 1, 2 ]
      

      In cases where path leads to "missing" nodes, a path is created. So, for example, on above document, and JsonPointer of /a/x an empty ArrayNode would be returned and the document would look like:

        { "a" : {
             "b" : [ 1, 2 ],
             "x" : [ ]
          }
        }
      
      Finally, if the path is incompatible with the document -- there is an existing JsonNode through which expression cannot go -- a replacement is attempted if (and only if) conversion is allowed as per overwriteMode passed in. For example, with above document and expression of /a/b/0, conversion is allowed if passing OverwriteMode.SCALARS or OvewriteMode.ALL, and resulting document would look like:
        { "a" : {
             "b" : [ [ ], 2 ],
             "x" : [ ]
          }
        }
      
      but if different modes (NONE or NULLS) is passed, an exception is thrown instead.
      Overrides:
      withArray in class JsonNode
      Parameters:
      ptr - Pointer that indicates path to use for ArrayNode value to return (potentially creating it as necessary)
      overwriteMode - Defines which node types may be converted in case of incompatible JsonPointer expression: if conversion not allowed, an exception is thrown.
      preferIndex - When creating a path (for empty or replacement), and path contains segment that may be an array index (simple integer number like 3), whether to construct an ArrayNode (true) or ObjectNode (false). In latter case matching property with quoted number (like "3") is used within Object.
      Returns:
      ArrayNode found or created
    • _withArray

      protected ArrayNode _withArray(JsonPointer origPtr, JsonPointer currentPtr, JsonNode.OverwriteMode overwriteMode, boolean preferIndex)
    • serialize

      public abstract void serialize(JsonGenerator g, SerializerProvider ctxt) throws IOException
      Method called to serialize node instances using given generator.
      Specified by:
      serialize in interface JsonSerializable
      Throws:
      IOException
    • serializeWithType

      public abstract void serializeWithType(JsonGenerator g, SerializerProvider ctxt, TypeSerializer typeSer) throws IOException
      Type information is needed, even if JsonNode instances are "plain" JSON, since they may be mixed with other types.
      Specified by:
      serializeWithType in interface JsonSerializable
      Throws:
      IOException
    • toString

      public String toString()
      Description copied from class: JsonNode
      Method that will produce (as of Jackson 2.10) valid JSON using default settings of databind, as String. If you want other kinds of JSON output (or output formatted using one of other Jackson-supported data formats) make sure to use ObjectMapper or ObjectWriter to serialize an instance, for example:
         String json = objectMapper.writeValueAsString(rootNode);
      

      Note: method defined as abstract to ensure all implementation classes explicitly implement method, instead of relying on Object.toString() definition.

      Specified by:
      toString in class JsonNode
    • toPrettyString

      public String toPrettyString()
      Description copied from class: JsonNode
      Alternative to JsonNode.toString() that will serialize this node using Jackson default pretty-printer.
      Overrides:
      toPrettyString in class JsonNode
    • _reportWrongNodeType

      protected <T> T _reportWrongNodeType(String msgTemplate, Object... args)
      Helper method that throws UnsupportedOperationException as a result of this node being of wrong type
    • _reportWrongNodeOperation

      protected <T> T _reportWrongNodeOperation(String msgTemplate, Object... args)
    • _jsonPointerIfValid

      protected JsonPointer _jsonPointerIfValid(String exprOrProperty)