@@ -220,7 +220,7 @@ public static <T> T fromParser(JsonParser parser, Class<T> type) throws DecodeEx
220220 JsonToken remaining ;
221221 try {
222222 parser .nextToken ();
223- res = parseAny (parser );
223+ res = parseValue (parser );
224224 remaining = parser .nextToken ();
225225 } catch (IOException e ) {
226226 throw new DecodeException (e .getMessage (), e );
@@ -233,12 +233,19 @@ public static <T> T fromParser(JsonParser parser, Class<T> type) throws DecodeEx
233233 return cast (res , type );
234234 }
235235
236- private static Object parseAny (JsonParser parser ) throws IOException , DecodeException {
236+ /**
237+ * Parse a JSON value given the {@code parser}, consuming the current parser token and possibly more
238+ * when parsing an object or an array.
239+ *
240+ * @param parser the parser
241+ * @return the parsed value as an object
242+ */
243+ public static Object parseValue (JsonParser parser ) throws IOException , DecodeException {
237244 switch (parser .currentTokenId ()) {
238245 case JsonTokenId .ID_START_OBJECT :
239- return parseObject (parser );
246+ return internalParseObject (parser );
240247 case JsonTokenId .ID_START_ARRAY :
241- return parseArray (parser );
248+ return internalParseArray (parser );
242249 case JsonTokenId .ID_STRING :
243250 return parser .getText ();
244251 case JsonTokenId .ID_NUMBER_FLOAT :
@@ -255,21 +262,34 @@ private static Object parseAny(JsonParser parser) throws IOException, DecodeExce
255262 }
256263 }
257264
258- private static Map <String , Object > parseObject (JsonParser parser ) throws IOException {
265+ /**
266+ * Parse a JSON object given the {@code parser}, the parser current token must be {@link JsonTokenId#ID_START_OBJECT}
267+ *
268+ * @param parser the parser
269+ * @return the parsed object
270+ */
271+ public static Map <String , Object > parseObject (JsonParser parser ) throws IOException {
272+ if (parser .currentTokenId () != JsonTokenId .ID_START_OBJECT ) {
273+ throw new DecodeException ("Expecting the current parser token to be the start of an object" );
274+ }
275+ return internalParseObject (parser );
276+ }
277+
278+ private static Map <String , Object > internalParseObject (JsonParser parser ) throws IOException {
259279 String key1 = parser .nextFieldName ();
260280 if (key1 == null ) {
261281 return new LinkedHashMap <>(2 );
262282 }
263283 parser .nextToken ();
264- Object value1 = parseAny (parser );
284+ Object value1 = parseValue (parser );
265285 String key2 = parser .nextFieldName ();
266286 if (key2 == null ) {
267287 LinkedHashMap <String , Object > obj = new LinkedHashMap <>(2 );
268288 obj .put (key1 , value1 );
269289 return obj ;
270290 }
271291 parser .nextToken ();
272- Object value2 = parseAny (parser );
292+ Object value2 = parseValue (parser );
273293 String key = parser .nextFieldName ();
274294 if (key == null ) {
275295 LinkedHashMap <String , Object > obj = new LinkedHashMap <>(2 );
@@ -283,14 +303,27 @@ private static Map<String, Object> parseObject(JsonParser parser) throws IOExcep
283303 obj .put (key2 , value2 );
284304 do {
285305 parser .nextToken ();
286- Object value = parseAny (parser );
306+ Object value = parseValue (parser );
287307 obj .put (key , value );
288308 key = parser .nextFieldName ();
289309 } while (key != null );
290310 return obj ;
291311 }
292312
293- private static List <Object > parseArray (JsonParser parser ) throws IOException {
313+ /**
314+ * Parse a JSON array given the {@code parser}, the parser current token must be {@link JsonTokenId#ID_START_ARRAY}
315+ *
316+ * @param parser the parser
317+ * @return the parsed array
318+ */
319+ public static List <Object > parseArray (JsonParser parser ) throws IOException {
320+ if (parser .currentTokenId () != JsonTokenId .ID_START_ARRAY ) {
321+ throw new DecodeException ("Expecting the current parser token to be the start of an array" );
322+ }
323+ return internalParseArray (parser );
324+ }
325+
326+ private static List <Object > internalParseArray (JsonParser parser ) throws IOException {
294327 List <Object > array = new ArrayList <>();
295328 while (true ) {
296329 parser .nextToken ();
@@ -300,7 +333,7 @@ private static List<Object> parseArray(JsonParser parser) throws IOException {
300333 } else if (tokenId == JsonTokenId .ID_END_ARRAY ) {
301334 return array ;
302335 }
303- Object value = parseAny (parser );
336+ Object value = parseValue (parser );
304337 array .add (value );
305338 }
306339 }
0 commit comments