• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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