1 package com.fasterxml.jackson.databind.node; 2 3 import java.io.IOException; 4 5 import com.fasterxml.jackson.core.*; 6 import com.fasterxml.jackson.databind.JsonNode; 7 import com.fasterxml.jackson.databind.SerializerProvider; 8 import com.fasterxml.jackson.databind.jsontype.TypeSerializer; 9 10 /** 11 * This singleton node class is generated to denote "missing nodes" 12 * along paths that do not exist. For example, if a path via 13 * element of an array is requested for an element outside range 14 * of elements in the array; or for a non-array value, result 15 * will be reference to this node. 16 *<p> 17 * In most respects this placeholder node will act as {@link NullNode}; 18 * for example, for purposes of value conversions, value is considered 19 * to be null and represented as value zero when used for numeric 20 * conversions. 21 */ 22 public final class MissingNode 23 extends ValueNode 24 { 25 private static final long serialVersionUID = 1L; 26 27 private final static MissingNode instance = new MissingNode(); 28 29 /** 30 *<p> 31 * NOTE: visibility raised to `protected` in 2.9.3 to allow custom subtypes 32 * (which may not be greatest idea ever to have but was requested) 33 */ MissingNode()34 protected MissingNode() { } 35 36 // To support JDK serialization, recovery of Singleton instance readResolve()37 protected Object readResolve() { 38 return instance; 39 } 40 41 @Override isMissingNode()42 public boolean isMissingNode() { 43 return true; 44 } 45 46 // Immutable: no need to copy 47 @SuppressWarnings("unchecked") 48 @Override deepCopy()49 public <T extends JsonNode> T deepCopy() { return (T) this; } 50 getInstance()51 public static MissingNode getInstance() { return instance; } 52 53 @Override getNodeType()54 public JsonNodeType getNodeType() 55 { 56 return JsonNodeType.MISSING; 57 } 58 asToken()59 @Override public JsonToken asToken() { return JsonToken.NOT_AVAILABLE; } 60 asText()61 @Override public String asText() { return ""; } 62 asText(String defaultValue)63 @Override public String asText(String defaultValue) { return defaultValue; } 64 65 // // Note: not a numeric node, hence default 'asXxx()' are fine: 66 67 /* 68 public int asInt(int defaultValue); 69 public long asLong(long defaultValue); 70 public double asDouble(double defaultValue); 71 public boolean asBoolean(boolean defaultValue); 72 */ 73 74 /* 75 /********************************************************** 76 /* Serialization: bit tricky as we don't really have a value 77 /********************************************************** 78 */ 79 80 @Override serialize(JsonGenerator g, SerializerProvider provider)81 public final void serialize(JsonGenerator g, SerializerProvider provider) 82 throws IOException, JsonProcessingException 83 { 84 /* Nothing to output... should we signal an error tho? 85 * Chances are, this is an erroneous call. For now, let's 86 * not do that; serialize as explicit null. Why? Because we 87 * cannot just omit a value as JSON Object field name may have 88 * been written out. 89 */ 90 g.writeNull(); 91 } 92 93 @Override serializeWithType(JsonGenerator g, SerializerProvider provider, TypeSerializer typeSer)94 public void serializeWithType(JsonGenerator g, SerializerProvider provider, 95 TypeSerializer typeSer) 96 throws IOException, JsonProcessingException 97 { 98 g.writeNull(); 99 } 100 101 /* 102 /********************************************************** 103 /* Jackson 2.10 improvements for validation 104 /********************************************************** 105 */ 106 107 @SuppressWarnings("unchecked") 108 @Override require()109 public JsonNode require() { 110 return _reportRequiredViolation("require() called on `MissingNode`"); 111 } 112 113 @SuppressWarnings("unchecked") 114 @Override requireNonNull()115 public JsonNode requireNonNull() { 116 return _reportRequiredViolation("requireNonNull() called on `MissingNode`"); 117 } 118 119 @Override hashCode()120 public int hashCode() { 121 return JsonNodeType.MISSING.ordinal(); 122 } 123 124 /* 125 /********************************************************** 126 /* Standard method overrides 127 /********************************************************** 128 */ 129 130 // 10-Dec-2019, tatu: Bit tricky case, see [databind#2566], but seems 131 // best NOT to produce legit JSON. 132 @Override toString()133 public String toString() { 134 return ""; 135 } 136 137 @Override toPrettyString()138 public String toPrettyString() { 139 return ""; 140 } 141 142 @Override equals(Object o)143 public boolean equals(Object o) 144 { 145 /* Hmmh. Since there's just a singleton instance, this fails in all cases but with 146 * identity comparison. However: if this placeholder value was to be considered 147 * similar to SQL NULL, it shouldn't even equal itself? 148 * That might cause problems when dealing with collections like Sets... 149 * so for now, let's let identity comparison return true. 150 */ 151 return (o == this); 152 } 153 } 154