1 package com.fasterxml.jackson.databind.util; 2 3 import java.io.IOException; 4 5 import com.fasterxml.jackson.core.JsonGenerator; 6 import com.fasterxml.jackson.core.SerializableString; 7 import com.fasterxml.jackson.databind.JsonSerializable; 8 import com.fasterxml.jackson.databind.SerializerProvider; 9 import com.fasterxml.jackson.databind.jsontype.TypeSerializer; 10 11 /** 12 * Helper class used to encapsulate "raw values", pre-encoded textual content 13 * that can be output as opaque value with no quoting/escaping, using 14 * {@link com.fasterxml.jackson.core.JsonGenerator#writeRawValue(String)}. 15 * It may be stored in {@link TokenBuffer}, as well as in Tree Model 16 * ({@link com.fasterxml.jackson.databind.JsonNode}) 17 * 18 * @since 2.6 19 */ 20 public class RawValue 21 implements JsonSerializable 22 { 23 /** 24 * Contents to serialize. Untyped because there are multiple types that are 25 * supported: {@link java.lang.String}, {@link JsonSerializable}, {@link SerializableString}. 26 */ 27 protected Object _value; 28 RawValue(String v)29 public RawValue(String v) { 30 _value = v; 31 } 32 RawValue(SerializableString v)33 public RawValue(SerializableString v) { 34 _value = v; 35 } 36 RawValue(JsonSerializable v)37 public RawValue(JsonSerializable v) { 38 _value = v; 39 } 40 41 /** 42 * Constructor that may be used by sub-classes, and allows passing value 43 * types other than ones for which explicit constructor exists. Caller has to 44 * take care that values of types not supported by base implementation are 45 * handled properly, usually by overriding some of existing serialization 46 * methods. 47 */ RawValue(Object value, boolean bogus)48 protected RawValue(Object value, boolean bogus) { 49 _value = value; 50 } 51 52 /** 53 * Accessor for returning enclosed raw value in whatever form it was created in 54 * (usually {@link java.lang.String}, {link SerializableString}, or any {@link JsonSerializable}). 55 */ rawValue()56 public Object rawValue() { 57 return _value; 58 } 59 60 @Override serialize(JsonGenerator gen, SerializerProvider serializers)61 public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException 62 { 63 if (_value instanceof JsonSerializable) { 64 ((JsonSerializable) _value).serialize(gen, serializers); 65 } else { 66 _serialize(gen); 67 } 68 } 69 70 @Override serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer)71 public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, 72 TypeSerializer typeSer) throws IOException 73 { 74 if (_value instanceof JsonSerializable) { 75 ((JsonSerializable) _value).serializeWithType(gen, serializers, typeSer); 76 } else if (_value instanceof SerializableString) { 77 /* Since these are not really to be deserialized (with or without type info), 78 * just re-route as regular write, which will create one... hopefully it works 79 */ 80 serialize(gen, serializers); 81 } 82 } 83 serialize(JsonGenerator gen)84 public void serialize(JsonGenerator gen) throws IOException 85 { 86 if (_value instanceof JsonSerializable) { 87 // No SerializerProvider passed, must go via generator, callback 88 gen.writeObject(_value); 89 } else { 90 _serialize(gen); 91 } 92 } 93 _serialize(JsonGenerator gen)94 protected void _serialize(JsonGenerator gen) throws IOException 95 { 96 if (_value instanceof SerializableString) { 97 gen.writeRawValue((SerializableString) _value); 98 } else { 99 gen.writeRawValue(String.valueOf(_value)); 100 } 101 } 102 103 @Override equals(Object o)104 public boolean equals(Object o) { 105 if (o == this) return true; 106 if (!(o instanceof RawValue)) return false; 107 RawValue other = (RawValue) o; 108 109 if (_value == other._value) { 110 return true; 111 } 112 return (_value != null) && _value.equals(other._value); 113 } 114 115 @Override hashCode()116 public int hashCode() { 117 return (_value == null) ? 0 : _value.hashCode(); 118 } 119 120 @Override toString()121 public String toString() { 122 return String.format("[RawValue of type %s]", ClassUtil.classNameOf(_value)); 123 } 124 } 125