1 /* Jackson JSON-processor.
2 *
3 * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
4 */
5
6 package com.fasterxml.jackson.core;
7
8 /**
9 * Enumeration for basic token types used for returning results
10 * of parsing JSON content.
11 */
12 public enum JsonToken
13 {
14 /* Some notes on implementation:
15 *
16 * - Entries are to be ordered such that start/end array/object
17 * markers come first, then field name marker (if any), and
18 * finally scalar value tokens. This is assumed by some
19 * typing checks.
20 */
21
22 /**
23 * NOT_AVAILABLE can be returned if {@link JsonParser}
24 * implementation can not currently return the requested
25 * token (usually next one), or even if any will be
26 * available, but that may be able to determine this in
27 * future. This is the case with non-blocking parsers --
28 * they can not block to wait for more data to parse and
29 * must return something.
30 */
31 NOT_AVAILABLE(null, JsonTokenId.ID_NOT_AVAILABLE),
32
33 /**
34 * START_OBJECT is returned when encountering '{'
35 * which signals starting of an Object value.
36 */
37 START_OBJECT("{", JsonTokenId.ID_START_OBJECT),
38
39 /**
40 * END_OBJECT is returned when encountering '}'
41 * which signals ending of an Object value
42 */
43 END_OBJECT("}", JsonTokenId.ID_END_OBJECT),
44
45 /**
46 * START_ARRAY is returned when encountering '['
47 * which signals starting of an Array value
48 */
49 START_ARRAY("[", JsonTokenId.ID_START_ARRAY),
50
51 /**
52 * END_ARRAY is returned when encountering ']'
53 * which signals ending of an Array value
54 */
55 END_ARRAY("]", JsonTokenId.ID_END_ARRAY),
56
57 /**
58 * FIELD_NAME is returned when a String token is encountered
59 * as a field name (same lexical value, different function)
60 */
61 FIELD_NAME(null, JsonTokenId.ID_FIELD_NAME),
62
63 /**
64 * Placeholder token returned when the input source has a concept
65 * of embedded Object that are not accessible as usual structure
66 * (of starting with {@link #START_OBJECT}, having values, ending with
67 * {@link #END_OBJECT}), but as "raw" objects.
68 *<p>
69 * Note: this token is never returned by regular JSON readers, but
70 * only by readers that expose other kinds of source (like
71 * <code>JsonNode</code>-based JSON trees, Maps, Lists and such).
72 */
73 VALUE_EMBEDDED_OBJECT(null, JsonTokenId.ID_EMBEDDED_OBJECT),
74
75 /**
76 * VALUE_STRING is returned when a String token is encountered
77 * in value context (array element, field value, or root-level
78 * stand-alone value)
79 */
80 VALUE_STRING(null, JsonTokenId.ID_STRING),
81
82 /**
83 * VALUE_NUMBER_INT is returned when an integer numeric token is
84 * encountered in value context: that is, a number that does
85 * not have floating point or exponent marker in it (consists
86 * only of an optional sign, followed by one or more digits;
87 * or, for binary formats, is indicated as integral number
88 * by internal representation).
89 */
90 VALUE_NUMBER_INT(null, JsonTokenId.ID_NUMBER_INT),
91
92 /**
93 * VALUE_NUMBER_FLOAT is returned when a numeric token other
94 * than integer is encountered: that is, a number that does
95 * have floating point or exponent marker in it, in addition
96 * to one or more digits (or, for non-textual formats,
97 * has internal floating-point representation).
98 */
99 VALUE_NUMBER_FLOAT(null, JsonTokenId.ID_NUMBER_FLOAT),
100
101 /**
102 * VALUE_TRUE is returned when encountering literal "true" in
103 * value context
104 */
105 VALUE_TRUE("true", JsonTokenId.ID_TRUE),
106
107 /**
108 * VALUE_FALSE is returned when encountering literal "false" in
109 * value context
110 */
111 VALUE_FALSE("false", JsonTokenId.ID_FALSE),
112
113 /**
114 * VALUE_NULL is returned when encountering literal "null" in
115 * value context
116 */
117 VALUE_NULL("null", JsonTokenId.ID_NULL),
118 ;
119
120 final String _serialized;
121
122 final char[] _serializedChars;
123
124 final byte[] _serializedBytes;
125
126 final int _id;
127
128 final boolean _isStructStart, _isStructEnd;
129
130 final boolean _isNumber;
131
132 final boolean _isBoolean;
133
134 final boolean _isScalar;
135
136 /**
137 * @param token representation for this token, if there is a
138 * single static representation; null otherwise
139 */
140 JsonToken(String token, int id)
141 {
142 if (token == null) {
143 _serialized = null;
144 _serializedChars = null;
145 _serializedBytes = null;
146 } else {
147 _serialized = token;
148 _serializedChars = token.toCharArray();
149 // It's all in ascii, can just case...
150 int len = _serializedChars.length;
151 _serializedBytes = new byte[len];
152 for (int i = 0; i < len; ++i) {
153 _serializedBytes[i] = (byte) _serializedChars[i];
154 }
155 }
156 _id = id;
157
158 _isBoolean = (id == JsonTokenId.ID_FALSE || id == JsonTokenId.ID_TRUE);
159 _isNumber = (id == JsonTokenId.ID_NUMBER_INT || id == JsonTokenId.ID_NUMBER_FLOAT);
160
161 _isStructStart = (id == JsonTokenId.ID_START_OBJECT || id == JsonTokenId.ID_START_ARRAY);
162 _isStructEnd = (id == JsonTokenId.ID_END_OBJECT || id == JsonTokenId.ID_END_ARRAY);
163
164 _isScalar = !_isStructStart && !_isStructEnd
165 && (id != JsonTokenId.ID_FIELD_NAME)
166 && (id != JsonTokenId.ID_NOT_AVAILABLE);
167 }
168
169 public final int id() { return _id; }
170
171 public final String asString() { return _serialized; }
172 public final char[] asCharArray() { return _serializedChars; }
173 public final byte[] asByteArray() { return _serializedBytes; }
174
175 public final boolean isNumeric() { return _isNumber; }
176
177 /**
178 * Accessor that is functionally equivalent to:
179 * <code>
180 * this == JsonToken.START_OBJECT || this == JsonToken.START_ARRAY
181 * </code>
182 *
183 * @since 2.3
184 */
185 public final boolean isStructStart() { return _isStructStart; }
186
187 /**
188 * Accessor that is functionally equivalent to:
189 * <code>
190 * this == JsonToken.END_OBJECT || this == JsonToken.END_ARRAY
191 * </code>
192 *
193 * @since 2.3
194 */
195 public final boolean isStructEnd() { return _isStructEnd; }
196
197 /**
198 * Method that can be used to check whether this token represents
199 * a valid non-structured value. This means all tokens other than
200 * Object/Array start/end markers all field names.
201 */
202 public final boolean isScalarValue() { return _isScalar; }
203 public final boolean isBoolean() { return _isBoolean; }
204 }
205