Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package com.fasterxml.jackson.databind.node;
  
  
 import java.util.List;
 import java.util.Map;

Node that maps to JSON Object structures in JSON content.

Note: class was final temporarily for Jackson 2.2.

 
 public class ObjectNode
     extends ContainerNode<ObjectNode>
 {
     // Note: LinkedHashMap for backwards compatibility
     private final Map<StringJsonNode_children
         = new LinkedHashMap<StringJsonNode>();
 
     public ObjectNode(JsonNodeFactory nc) { super(nc); }
 
     @Override
     protected JsonNode _at(JsonPointer ptr) {
         return get(ptr.getMatchingProperty());
     }
 
     /* Question: should this delegate to `JsonNodeFactory`? It does not absolutely
      * have to, as long as sub-types override the method but...
      */
     // note: co-variant for type safety
     @SuppressWarnings("unchecked")
     @Override
     public ObjectNode deepCopy()
     {
         ObjectNode ret = new ObjectNode();
 
         for (Map.Entry<StringJsonNodeentry.entrySet())
             ret._children.put(entry.getKey(), entry.getValue().deepCopy());
 
         return ret;
     }
 
     /*
     /**********************************************************
     /* Implementation of core JsonNode API
     /**********************************************************
      */
 
     @Override
     public JsonNodeType getNodeType()
     {
         return .;
     }
 
     @Override public JsonToken asToken() { return .; }
 
     @Override
     public int size() {
         return .size();
     }
 
     @Override
     public Iterator<JsonNodeelements()
     {
         return .values().iterator();
     }
 
     @Override
     public JsonNode get(int index) { return null; }
 
     @Override
     public JsonNode get(String fieldName)
     {
         return .get(fieldName);
     }
 
     @Override
     public Iterator<StringfieldNames()
     {
         return .keySet().iterator();
     }
 
     @Override
     public JsonNode path(int index)
     {
         return MissingNode.getInstance();
     }
 
     @Override
    public JsonNode path(String fieldName)
    {
        JsonNode n = .get(fieldName);
        if (n != null) {
            return n;
        }
        return MissingNode.getInstance();
    }

    
Method to use for accessing all fields (with both names and values) of this JSON Object.
    @Override
    public Iterator<Map.Entry<StringJsonNode>> fields()
    {
        return .entrySet().iterator();
    }
    @Override
    public ObjectNode with(String propertyName)
    {
        JsonNode n = .get(propertyName);
        if (n != null) {
            if (n instanceof ObjectNode) {
                return (ObjectNoden;
            }
            throw new UnsupportedOperationException("Property '" + propertyName
                + "' has value that is not of type ObjectNode (but " + n
                .getClass().getName() + ")");
        }
        ObjectNode result = objectNode();
        .put(propertyNameresult);
        return result;
    }
    @Override
    public ArrayNode withArray(String propertyName)
    {
        JsonNode n = .get(propertyName);
        if (n != null) {
            if (n instanceof ArrayNode) {
                return (ArrayNoden;
            }
            throw new UnsupportedOperationException("Property '" + propertyName
                + "' has value that is not of type ArrayNode (but " + n
                .getClass().getName() + ")");
        }
        ArrayNode result = arrayNode();
        .put(propertyNameresult);
        return result;
    }
    
    /*
    /**********************************************************
    /* Public API, finding value nodes
    /**********************************************************
     */
    
    @Override
    public JsonNode findValue(String fieldName)
    {
        for (Map.Entry<StringJsonNodeentry : .entrySet()) {
            if (fieldName.equals(entry.getKey())) {
                return entry.getValue();
            }
            JsonNode value = entry.getValue().findValue(fieldName);
            if (value != null) {
                return value;
            }
        }
        return null;
    }
    
    @Override
    public List<JsonNodefindValues(String fieldNameList<JsonNodefoundSoFar)
    {
        for (Map.Entry<StringJsonNodeentry : .entrySet()) {
            if (fieldName.equals(entry.getKey())) {
                if (foundSoFar == null) {
                    foundSoFar = new ArrayList<JsonNode>();
                }
                foundSoFar.add(entry.getValue());
            } else { // only add children if parent not added
                foundSoFar = entry.getValue().findValues(fieldNamefoundSoFar);
            }
        }
        return foundSoFar;
    }
    @Override
    public List<StringfindValuesAsText(String fieldNameList<StringfoundSoFar)
    {
        for (Map.Entry<StringJsonNodeentry : .entrySet()) {
            if (fieldName.equals(entry.getKey())) {
                if (foundSoFar == null) {
                    foundSoFar = new ArrayList<String>();
                }
                foundSoFar.add(entry.getValue().asText());
            } else { // only add children if parent not added
                foundSoFar = entry.getValue().findValuesAsText(fieldName,
                    foundSoFar);
            }
        }
        return foundSoFar;
    }
    
    @Override
    public ObjectNode findParent(String fieldName)
    {
        for (Map.Entry<StringJsonNodeentry : .entrySet()) {
            if (fieldName.equals(entry.getKey())) {
                return this;
            }
            JsonNode value = entry.getValue().findParent(fieldName);
            if (value != null) {
                return (ObjectNodevalue;
            }
        }
        return null;
    }
    @Override
    public List<JsonNodefindParents(String fieldNameList<JsonNodefoundSoFar)
    {
        for (Map.Entry<StringJsonNodeentry : .entrySet()) {
            if (fieldName.equals(entry.getKey())) {
                if (foundSoFar == null) {
                    foundSoFar = new ArrayList<JsonNode>();
                }
                foundSoFar.add(this);
            } else { // only add children if parent not added
                foundSoFar = entry.getValue()
                    .findParents(fieldNamefoundSoFar);
            }
        }
        return foundSoFar;
    }
    
    /*
    /**********************************************************
    /* Public API, serialization
    /**********************************************************
     */

    
Method that can be called to serialize this node and all of its descendants using specified JSON generator.
    @Override
    public void serialize(JsonGenerator jgSerializerProvider provider)
        throws IOExceptionJsonProcessingException
    {
        jg.writeStartObject();
        for (Map.Entry<StringJsonNodeen : .entrySet()) {
            jg.writeFieldName(en.getKey());
                /* 17-Feb-2009, tatu: Can we trust that all nodes will always
                 *   extend BaseJsonNode? Or if not, at least implement
                 *   JsonSerializable? Let's start with former, change if
                 *   we must.
                 */
            ((BaseJsonNodeen.getValue()).serialize(jgprovider);
        }
        jg.writeEndObject();
    }
    @Override
    public void serializeWithType(JsonGenerator jgSerializerProvider provider,
            TypeSerializer typeSer)
        throws IOExceptionJsonProcessingException
    {
        typeSer.writeTypePrefixForObject(thisjg);
        for (Map.Entry<StringJsonNodeen : .entrySet()) {
            jg.writeFieldName(en.getKey());
            ((BaseJsonNodeen.getValue()).serialize(jgprovider);
        }
        typeSer.writeTypeSuffixForObject(thisjg);
    }
    /*
    /**********************************************************
    /* Extended ObjectNode API, mutators, since 2.1
    /**********************************************************
     */

    
Method that will set specified field, replacing old value, if any. Note that this is identical to replace(java.lang.String,com.fasterxml.jackson.databind.JsonNode), except for return value.

NOTE: added to replace those uses of put(java.lang.String,com.fasterxml.jackson.databind.JsonNode) where chaining with 'this' is desired.

Parameters:
value to set field to; if null, will be converted to a NullNode first (to remove field entry, call remove(java.lang.String) instead)
Returns:
This node after adding/replacing property value (to allow chaining)
Since:
2.1
    public JsonNode set(String fieldNameJsonNode value)
    {
        if (value == null) {
            value = nullNode();
        }
        .put(fieldNamevalue);
        return this;
    }

    
Method for adding given properties to this object node, overriding any existing values for those properties.

Parameters:
properties Properties to add
Returns:
This node after adding/replacing property values (to allow chaining)
Since:
2.1
    public JsonNode setAll(Map<String,JsonNodeproperties)
    {
        for (Map.Entry<StringJsonNodeen : properties.entrySet()) {
            JsonNode n = en.getValue();
            if (n == null) {
                n = nullNode();
            }
            .put(en.getKey(), n);
        }
        return this;
    }

    
Method for adding all properties of the given Object, overriding any existing values for those properties.

Parameters:
other Object of which properties to add to this object
Returns:
This node after addition (to allow chaining)
Since:
2.1
    public JsonNode setAll(ObjectNode other)
    {
        .putAll(other._children);
        return this;
    }
    
    
Method for replacing value of specific property with passed value, and returning value (or null if none).

Parameters:
fieldName Property of which value to replace
value Value to set property to, replacing old value if any
Returns:
Old value of the property; null if there was no such property with value
Since:
2.1
    public JsonNode replace(String fieldNameJsonNode value)
    {
        if (value == null) { // let's not store 'raw' nulls but nodes
            value = nullNode();
        }
        return .put(fieldNamevalue);
    }

    
Method for removing field entry from this ObjectNode, and returning instance after removal.

Returns:
This node after removing entry (if any)
Since:
2.1
    public JsonNode without(String fieldName)
    {
        .remove(fieldName);
        return this;
    }

    
Method for removing specified field properties out of this ObjectNode.

Parameters:
fieldNames Names of fields to remove
Returns:
This node after removing entries
Since:
2.1
    public ObjectNode without(Collection<StringfieldNames)
    {
        .keySet().removeAll(fieldNames);
        return this;
    }
    
    /*
    /**********************************************************
    /* Extended ObjectNode API, mutators, generic
    /**********************************************************
     */
    
    
Method that will set specified field, replacing old value, if any.

Parameters:
value to set field to; if null, will be converted to a NullNode first (to remove field entry, call remove(java.lang.String) instead)

NOTE: this method will be deprecated in 2.2; and should be replace with either set(java.lang.String,com.fasterxml.jackson.databind.JsonNode) or replace(java.lang.String,com.fasterxml.jackson.databind.JsonNode), depending on which return value is desired for possible chaining.

Returns:
Old value of the field, if any; null if there was no old value.
    public JsonNode put(String fieldNameJsonNode value)
    {
        if (value == null) { // let's not store 'raw' nulls but nodes
            value = nullNode();
        }
        return .put(fieldNamevalue);
    }
    
    
Method for removing field entry from this ObjectNode. Will return value of the field, if such field existed; null if not.

Returns:
Value of specified field, if it existed; null if not
    public JsonNode remove(String fieldName)
    {
        return .remove(fieldName);
    }

    
Method for removing specified field properties out of this ObjectNode.

Parameters:
fieldNames Names of fields to remove
Returns:
This node after removing entries
    public ObjectNode remove(Collection<StringfieldNames)
    {
        .keySet().removeAll(fieldNames);
        return this;
    }
    
    
Method for removing all field properties, such that this ObjectNode will contain no properties after call.

Returns:
This node after removing all entries
    @Override
    public ObjectNode removeAll()
    {
        .clear();
        return this;
    }

    
Method for adding given properties to this object node, overriding any existing values for those properties.

NOTE: this method will be deprecated in 2.2; and should be replace with setAll(java.util.Map).

Parameters:
properties Properties to add
Returns:
This node after adding/replacing property values (to allow chaining)
    public JsonNode putAll(Map<String,JsonNodeproperties) {
        return setAll(properties);
    }

    
Method for adding all properties of the given Object, overriding any existing values for those properties.

NOTE: this method will be deprecated in 2.2; and should be replace with setAll(com.fasterxml.jackson.databind.node.ObjectNode).

Parameters:
other Object of which properties to add to this object
Returns:
This node (to allow chaining)
    public JsonNode putAll(ObjectNode other) {
        return setAll(other);
    }

    
Method for removing all field properties out of this ObjectNode except for ones specified in argument.

Parameters:
fieldNames Fields to retain in this ObjectNode
Returns:
This node (to allow call chaining)
    public ObjectNode retain(Collection<StringfieldNames)
    {
        .keySet().retainAll(fieldNames);
        return this;
    }

    
Method for removing all field properties out of this ObjectNode except for ones specified in argument.

Parameters:
fieldNames Fields to retain in this ObjectNode
Returns:
This node (to allow call chaining)
    public ObjectNode retain(String... fieldNames) {
        return retain(Arrays.asList(fieldNames));
    }
    
    /*
    /**********************************************************
    /* Extended ObjectNode API, mutators, typed
    /**********************************************************
     */

    
Method that will construct an ArrayNode and add it as a field of this ObjectNode, replacing old value, if any.

NOTE: Unlike all put(...) methods, return value is NOT this ObjectNode, but the newly created ArrayNode instance.

Returns:
Newly constructed ArrayNode (NOT the old value, which could be of any type)
    public ArrayNode putArray(String fieldName)
    {
        ArrayNode n  = arrayNode();
        _put(fieldNamen);
        return n;
    }

    
Method that will construct an ObjectNode and add it as a field of this ObjectNode, replacing old value, if any.

NOTE: Unlike all put(...) methods, return value is NOT this ObjectNode, but the newly created ObjectNode instance.

Returns:
Newly constructed ObjectNode (NOT the old value, which could be of any type)
    public ObjectNode putObject(String fieldName)
    {
        ObjectNode n = objectNode();
        _put(fieldNamen);
        return n;
    }

    

Returns:
This node (to allow chaining)
    public ObjectNode putPOJO(String fieldNameObject pojo) {
        return _put(fieldNamepojoNode(pojo));
    }

    

Returns:
This node (to allow chaining)
    public ObjectNode putNull(String fieldName)
    {
        .put(fieldNamenullNode());
        return this;
    }

    
Method for setting value of a field to specified numeric value.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNameshort v) {
        return _put(fieldNamenumberNode(v));
    }

    
Alternative method that we need to avoid bumping into NPE issues with auto-unboxing.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNameShort v) {
        return _put(fieldName, (v == null) ? nullNode()
                : numberNode(v.shortValue()));
    }

    
Method for setting value of a field to specified numeric value.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNameint v) {
        return _put(fieldNamenumberNode(v));
    }

    
Alternative method that we need to avoid bumping into NPE issues with auto-unboxing.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNameInteger v) {
        return _put(fieldName, (v == null) ? nullNode()
                : numberNode(v.intValue()));
    }
    
    
Method for setting value of a field to specified numeric value.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNamelong v) {
        return _put(fieldNamenumberNode(v));
    }

    
Alternative method that we need to avoid bumping into NPE issues with auto-unboxing.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNameLong v) {
        return _put(fieldName, (v == null) ? nullNode()
                : numberNode(v.longValue()));
    }
    
    
Method for setting value of a field to specified numeric value.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNamefloat v) {
        return _put(fieldNamenumberNode(v));
    }

    
Alternative method that we need to avoid bumping into NPE issues with auto-unboxing.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNameFloat v) {
        return _put(fieldName, (v == null) ? nullNode()
                : numberNode(v.floatValue()));
    }
    
    
Method for setting value of a field to specified numeric value.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNamedouble v) {
        return _put(fieldNamenumberNode(v));
    }

    
Alternative method that we need to avoid bumping into NPE issues with auto-unboxing.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNameDouble v) {
        return _put(fieldName, (v == null) ? nullNode()
                : numberNode(v.doubleValue()));
    }
    
    
Method for setting value of a field to specified numeric value.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNameBigDecimal v) {
        return _put(fieldName, (v == null) ? nullNode()
                : numberNode(v));
    }

    
Method for setting value of a field to specified String value.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNameString v) {
        return _put(fieldName, (v == null) ? nullNode()
                : textNode(v));
    }

    
Method for setting value of a field to specified String value.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNameboolean v) {
        return _put(fieldNamebooleanNode(v));
    }

    
Alternative method that we need to avoid bumping into NPE issues with auto-unboxing.

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNameBoolean v) {
        return _put(fieldName, (v == null) ? nullNode()
                : booleanNode(v.booleanValue()));
    }
    
    
Method for setting value of a field to specified binary value

Returns:
This node (to allow chaining)
    public ObjectNode put(String fieldNamebyte[] v) {
        return _put(fieldName, (v == null) ? nullNode()
                : binaryNode(v));
    }
    
    /*
    /**********************************************************
    /* Standard methods
    /**********************************************************
     */
    @Override
    public boolean equals(Object o)
    {
        if (o == thisreturn true;
        if (o == nullreturn false;
        if (o instanceof ObjectNode) {
            return _childrenEqual((ObjectNodeo);
        }
        return false;
    }

    

Since:
2.3
    protected boolean _childrenEqual(ObjectNode other)
    {
        return .equals(other._children);
    }
    
    @Override
    public int hashCode()
    {
        return .hashCode();
    }
    @Override
    public String toString()
    {
        StringBuilder sb = new StringBuilder(32 + (size() << 4));
        sb.append("{");
        int count = 0;
        for (Map.Entry<StringJsonNodeen : .entrySet()) {
            if (count > 0) {
                sb.append(",");
            }
            ++count;
            TextNode.appendQuoted(sben.getKey());
            sb.append(':');
            sb.append(en.getValue().toString());
        }
        sb.append("}");
        return sb.toString();
    }
    /*
    /**********************************************************
    /* Internal methods (overridable)
    /**********************************************************
     */
    protected ObjectNode _put(String fieldNameJsonNode value)
    {
        .put(fieldNamevalue);
        return this;
    }
New to GrepCode? Check out our FAQ X