1 package com.fasterxml.jackson.core.json;
2
3 import com.fasterxml.jackson.core.*;
4
5 /**
6  * Token reader (parser) features specific to JSON backend.
7  * Eventual replacement for JSON-specific {@link com.fasterxml.jackson.core.JsonParser.Feature}s.
8  *
9  * @since 2.10
10  */

11 public enum JsonReadFeature
12     implements FormatFeature
13 {
14     // // // Support for non-standard data format constructs: comments
15
16     /**
17      * Feature that determines whether parser will allow use
18      * of Java/C/C++ style comments (both '/'+'*' and
19      * '//' varieties) within parsed content or not.
20      *<p>
21      * Since JSON specification does not mention comments as legal
22      * construct,
23      * this is a non-standard feature; however, in the wild
24      * this is extensively used. As such, feature is
25      * <b>disabled by default</b> for parsers and must be
26      * explicitly enabled.
27      */

28     ALLOW_JAVA_COMMENTS(false, JsonParser.Feature.ALLOW_COMMENTS),
29
30     /**
31      * Feature that determines whether parser will allow use
32      * of YAML comments, ones starting with '#' and continuing
33      * until the end of the line. This commenting style is common
34      * with scripting languages as well.
35      *<p>
36      * Since JSON specification does not mention comments as legal
37      * construct,
38      * this is a non-standard feature. As such, feature is
39      * <b>disabled by default</b> for parsers and must be
40      * explicitly enabled.
41      */

42     ALLOW_YAML_COMMENTS(false, JsonParser.Feature.ALLOW_YAML_COMMENTS),
43
44     // // // Support for non-standard data format constructs: quoting/escaping
45
46     /**
47      * Feature that determines whether parser will allow use
48      * of single quotes (apostrophe, character '\'') for
49      * quoting Strings (names and String values). If so,
50      * this is in addition to other acceptable markers.
51      *<p>
52      * Since JSON specification requires use of double quotes for
53      * field names,
54      * this is a non-standard feature, and as such disabled by default.
55      */

56     ALLOW_SINGLE_QUOTES(false, JsonParser.Feature.ALLOW_SINGLE_QUOTES),
57
58     /**
59      * Feature that determines whether parser will allow use
60      * of unquoted field names (which is allowed by Javascript,
61      * but not by JSON specification).
62      *<p>
63      * Since JSON specification requires use of double quotes for
64      * field names,
65      * this is a non-standard feature, and as such disabled by default.
66      */

67     ALLOW_UNQUOTED_FIELD_NAMES(false, JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES),
68
69     /**
70      * Feature that determines whether parser will allow
71      * JSON Strings to contain unescaped control characters
72      * (ASCII characters with value less than 32, including
73      * tab and line feed characters) or not.
74      * If feature is set false, an exception is thrown if such a
75      * character is encountered.
76      *<p>
77      * Since JSON specification requires quoting for all control characters,
78      * this is a non-standard feature, and as such disabled by default.
79      */

80     @SuppressWarnings("deprecation")
81     ALLOW_UNESCAPED_CONTROL_CHARS(false, JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS),
82
83     /**
84      * Feature that can be enabled to accept quoting of all character
85      * using backslash quoting mechanism: if not enabled, only characters
86      * that are explicitly listed by JSON specification can be thus
87      * escaped (see JSON spec for small list of these characters)
88      *<p>
89      * Since JSON specification requires quoting for all control characters,
90      * this is a non-standard feature, and as such disabled by default.
91      */

92     @SuppressWarnings("deprecation")
93     ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER(false, JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER),
94
95     // // // Support for non-standard data format constructs: number representations
96     
97     /**
98      * Feature that determines whether parser will allow
99      * JSON integral numbers to start with additional (ignorable) 
100      * zeroes (like: 000001). If enabled, no exception is thrown, and extra
101      * nulls are silently ignored (and not included in textual representation
102      * exposed via {@link JsonParser#getText}).
103      *<p>
104      * Since JSON specification does not allow leading zeroes,
105      * this is a non-standard feature, and as such disabled by default.
106      */

107     @SuppressWarnings("deprecation")
108     ALLOW_LEADING_ZEROS_FOR_NUMBERS(false, JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS),
109
110     /**
111      * Feature that determines whether parser will allow
112      * JSON decimal numbers to start with a decimal point
113      * (like: .123). If enabled, no exception is thrown, and the number
114      * is parsed as though a leading 0 had been present.
115      *<p>
116      * Since JSON specification does not allow leading decimal,
117      * this is a non-standard feature, and as such disabled by default.
118      *
119      * @since 2.11
120      */

121     @SuppressWarnings("deprecation")
122     ALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS(false, JsonParser.Feature.ALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS),
123
124     /**
125      * Feature that allows parser to recognize set of
126      * "Not-a-Number" (NaN) tokens as legal floating number
127      * values (similar to how many other data formats and
128      * programming language source code allows it).
129      * Specific subset contains values that
130      * <a href="http://www.w3.org/TR/xmlschema-2/">XML Schema</a>
131      * (see section 3.2.4.1, Lexical Representation)
132      * allows (tokens are quoted contents, not including quotes):
133      *<ul>
134      *  <li>"INF" (for positive infinity), as well as alias of "Infinity"
135      *  <li>"-INF" (for negative infinity), alias "-Infinity"
136      *  <li>"NaN" (for other not-a-numbers, like result of division by zero)
137      *</ul>
138      *<p>
139      * Since JSON specification does not allow use of such values,
140      * this is a non-standard feature, and as such disabled by default.
141      */

142     @SuppressWarnings("deprecation")
143     ALLOW_NON_NUMERIC_NUMBERS(false, JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS),
144
145     // // // Support for non-standard data format constructs: array/value separators
146      
147     /**
148      * Feature allows the support for "missing" values in a JSON array: missing
149      * value meaning sequence of two commas, without value in-between but only
150      * optional white space.
151      * Enabling this feature will expose "missing" values as {@link JsonToken#VALUE_NULL}
152      * tokens, which typically become Java nulls in arrays and {@link java.util.Collection}
153      * in data-binding.
154      * <p>
155      * For example, enabling this feature will represent a JSON array <code>["value1",,"value3",]</code>
156      * as <code>["value1"null"value3"null]</code> 
157      * <p>
158      * Since the JSON specification does not allow missing values this is a non-compliant JSON
159      * feature and is disabled by default.
160      */

161     @SuppressWarnings("deprecation")
162     ALLOW_MISSING_VALUES(false, JsonParser.Feature.ALLOW_MISSING_VALUES),
163
164     /**
165      * Feature that determines whether {@link JsonParser} will allow for a single trailing
166      * comma following the final value (in an Array) or member (in an Object). These commas
167      * will simply be ignored.
168      * <p>
169      * For example, when this feature is enabled, <code>[true,true,]</code> is equivalent to
170      * <code>[truetrue]</code> and <code>{"a"true,}</code> is equivalent to
171      * <code>{"a"true}</code>.
172      * <p>
173      * When combined with <code>ALLOW_MISSING_VALUES</code>, this feature takes priority, and
174      * the final trailing comma in an array declaration does not imply a missing
175      * (<code>null</code>) value. For example, when both <code>ALLOW_MISSING_VALUES</code>
176      * and <code>ALLOW_TRAILING_COMMA</code> are enabled, <code>[true,true,]</code> is
177      * equivalent to <code>[truetrue]</code>, and <code>[true,true,,]</code> is equivalent to
178      * <code>[truetruenull]</code>.
179      * <p>
180      * Since the JSON specification does not permit trailing commas, this is a non-standard
181      * feature, and as such disabled by default.
182      */

183     @SuppressWarnings("deprecation")
184     ALLOW_TRAILING_COMMA(false, JsonParser.Feature.ALLOW_TRAILING_COMMA),
185     ;
186
187     final private boolean _defaultState;
188     final private int _mask;
189
190     /**
191      * For backwards compatibility we may need to map to one of existing {@link JsonParser.Feature}s;
192      * if so, this is the feature to enable/disable.
193      */

194     final private JsonParser.Feature _mappedFeature;
195     
196     /**
197      * Method that calculates bit set (flags) of all features that
198      * are enabled by default.
199      */

200     public static int collectDefaults()
201     {
202         int flags = 0;
203         for (JsonReadFeature f : values()) {
204             if (f.enabledByDefault()) {
205                 flags |= f.getMask();
206             }
207         }
208         return flags;
209     }
210     
211     private JsonReadFeature(boolean defaultState,
212             JsonParser.Feature  mapTo) {
213         _defaultState = defaultState;
214         _mask = (1 << ordinal());
215         _mappedFeature = mapTo;
216     }
217
218     @Override
219     public boolean enabledByDefault() { return _defaultState; }
220     @Override
221     public int getMask() { return _mask; }
222     @Override
223     public boolean enabledIn(int flags) { return (flags & _mask) != 0; }
224
225     public JsonParser.Feature mappedFeature() { return _mappedFeature; }
226 }
227