com.fasterxml.jackson.databind.util.RawValue Maven / Gradle / Ivy
The newest version!
package com.fasterxml.jackson.databind.util;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.SerializableString;
import com.fasterxml.jackson.databind.JsonSerializable;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
/**
* Helper class used to encapsulate "raw values", pre-encoded textual content
* that can be output as opaque value with no quoting/escaping, using
* {@link com.fasterxml.jackson.core.JsonGenerator#writeRawValue(String)}.
* It may be stored in {@link TokenBuffer}, as well as in Tree Model
* ({@link com.fasterxml.jackson.databind.JsonNode})
*
* @since 2.6
*/
public class RawValue
implements JsonSerializable
{
/**
* Contents to serialize. Untyped because there are multiple types that are
* supported: {@link java.lang.String}, {@link JsonSerializable}, {@link SerializableString}.
*/
protected Object _value;
public RawValue(String v) {
_value = v;
}
public RawValue(SerializableString v) {
_value = v;
}
public RawValue(JsonSerializable v) {
_value = v;
}
/**
* Constructor that may be used by sub-classes, and allows passing value
* types other than ones for which explicit constructor exists. Caller has to
* take care that values of types not supported by base implementation are
* handled properly, usually by overriding some of existing serialization
* methods.
*/
protected RawValue(Object value, boolean bogus) {
_value = value;
}
/**
* Accessor for returning enclosed raw value in whatever form it was created in
* (usually {@link java.lang.String}, {link SerializableString}, or any {@link JsonSerializable}).
*/
public Object rawValue() {
return _value;
}
@Override
public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException
{
if (_value instanceof JsonSerializable) {
((JsonSerializable) _value).serialize(gen, serializers);
} else {
_serialize(gen);
}
}
@Override
public void serializeWithType(JsonGenerator gen, SerializerProvider serializers,
TypeSerializer typeSer) throws IOException
{
if (_value instanceof JsonSerializable) {
((JsonSerializable) _value).serializeWithType(gen, serializers, typeSer);
} else if (_value instanceof SerializableString) {
/* Since these are not really to be deserialized (with or without type info),
* just re-route as regular write, which will create one... hopefully it works
*/
serialize(gen, serializers);
}
}
public void serialize(JsonGenerator gen) throws IOException
{
if (_value instanceof JsonSerializable) {
// No SerializerProvider passed, must go via generator, callback
gen.writeObject(_value);
} else {
_serialize(gen);
}
}
protected void _serialize(JsonGenerator gen) throws IOException
{
if (_value instanceof SerializableString) {
gen.writeRawValue((SerializableString) _value);
} else {
gen.writeRawValue(String.valueOf(_value));
}
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof RawValue)) return false;
RawValue other = (RawValue) o;
if (_value == other._value) {
return true;
}
return (_value != null) && _value.equals(other._value);
}
@Override
public int hashCode() {
return (_value == null) ? 0 : _value.hashCode();
}
@Override
public String toString() {
return String.format("[RawValue of type %s]", ClassUtil.classNameOf(_value));
}
}