Skip to content

Commit 4770876

Browse files
committed
Bit of refactoring
1 parent 4889ab4 commit 4770876

File tree

1 file changed

+81
-82
lines changed

1 file changed

+81
-82
lines changed

src/main/java/com/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer.java

Lines changed: 81 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,20 @@ public JsonNode getNullValue(DeserializationContext ctxt) {
6565
@Override
6666
public JsonNode deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
6767
{
68+
final ContainerStack stack = new ContainerStack();
69+
final JsonNodeFactory nodeF = ctxt.getNodeFactory();
6870
switch (p.currentTokenId()) {
6971
case JsonTokenId.ID_START_OBJECT:
70-
return deserializeObject(p, ctxt, ctxt.getNodeFactory());
72+
return deserializeObject(p, ctxt, nodeF, stack);
73+
case JsonTokenId.ID_END_OBJECT:
74+
return nodeF.objectNode();
7175
case JsonTokenId.ID_START_ARRAY:
72-
return deserializeArray(p, ctxt, ctxt.getNodeFactory());
76+
return deserializeArray(p, ctxt, nodeF, stack);
77+
case JsonTokenId.ID_FIELD_NAME:
78+
return deserializeObjectAtName(p, ctxt, nodeF, stack);
7379
default:
7480
}
75-
return deserializeAny(p, ctxt, ctxt.getNodeFactory());
81+
return deserializeAnyScalar(p, ctxt);
7682
}
7783

7884
/*
@@ -96,10 +102,10 @@ final static class ObjectDeserializer
96102
public ObjectNode deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
97103
{
98104
if (p.isExpectedStartObjectToken()) {
99-
return deserializeObject(p, ctxt, ctxt.getNodeFactory());
105+
return deserializeObject(p, ctxt, ctxt.getNodeFactory(), new ContainerStack());
100106
}
101107
if (p.hasToken(JsonToken.FIELD_NAME)) {
102-
return deserializeObjectAtName(p, ctxt, ctxt.getNodeFactory());
108+
return deserializeObjectAtName(p, ctxt, ctxt.getNodeFactory(), new ContainerStack());
103109
}
104110
// 23-Sep-2015, tatu: Ugh. We may also be given END_OBJECT (similar to FIELD_NAME),
105111
// if caller has advanced to the first token of Object, but for empty Object
@@ -140,7 +146,8 @@ final static class ArrayDeserializer
140146
public ArrayNode deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
141147
{
142148
if (p.isExpectedStartArrayToken()) {
143-
return deserializeArray(p, ctxt, ctxt.getNodeFactory());
149+
return deserializeArray(p, ctxt, ctxt.getNodeFactory(),
150+
new ContainerStack());
144151
}
145152
return (ArrayNode) ctxt.handleUnexpectedToken(ArrayNode.class, p);
146153
}
@@ -263,7 +270,7 @@ protected void _handleDuplicateField(JsonParser p, DeserializationContext ctxt,
263270
* node to modify.
264271
*/
265272
protected final ObjectNode deserializeObject(JsonParser p, DeserializationContext ctxt,
266-
final JsonNodeFactory nodeFactory) throws IOException
273+
final JsonNodeFactory nodeFactory, final ContainerStack stack) throws IOException
267274
{
268275
final ObjectNode node = nodeFactory.objectNode();
269276
String key = p.nextFieldName();
@@ -277,14 +284,14 @@ protected final ObjectNode deserializeObject(JsonParser p, DeserializationContex
277284
case JsonTokenId.ID_START_OBJECT:
278285
// Need to avoid deep recursion, so:
279286
value = deserializeContainerNonRecursive(p, ctxt, nodeFactory,
280-
nodeFactory.objectNode());
287+
stack, nodeFactory.objectNode());
281288
break;
282289
case JsonTokenId.ID_START_ARRAY:
283290
// Ok to do one level of recursion:
284-
value = deserializeArray(p, ctxt, nodeFactory);
291+
value = deserializeArray(p, ctxt, nodeFactory, stack);
285292
break;
286293
case JsonTokenId.ID_EMBEDDED_OBJECT:
287-
value = _fromEmbedded(p, ctxt, nodeFactory);
294+
value = _fromEmbedded(p, ctxt);
288295
break;
289296
case JsonTokenId.ID_STRING:
290297
value = nodeFactory.textNode(p.getText());
@@ -302,7 +309,7 @@ protected final ObjectNode deserializeObject(JsonParser p, DeserializationContex
302309
value = nodeFactory.nullNode();
303310
break;
304311
default:
305-
value = deserializeAny(p, ctxt, nodeFactory);
312+
value = deserializeRareScalar(p, ctxt);
306313
}
307314
JsonNode old = node.replace(key, value);
308315
if (old != null) {
@@ -320,7 +327,7 @@ protected final ObjectNode deserializeObject(JsonParser p, DeserializationContex
320327
* @since 2.9
321328
*/
322329
protected final ObjectNode deserializeObjectAtName(JsonParser p, DeserializationContext ctxt,
323-
final JsonNodeFactory nodeFactory) throws IOException
330+
final JsonNodeFactory nodeFactory, final ContainerStack stack) throws IOException
324331
{
325332
final ObjectNode node = nodeFactory.objectNode();
326333
String key = p.currentName();
@@ -334,14 +341,11 @@ protected final ObjectNode deserializeObjectAtName(JsonParser p, Deserialization
334341
case JsonTokenId.ID_START_OBJECT:
335342
// Need to avoid deep recursion, so:
336343
value = deserializeContainerNonRecursive(p, ctxt, nodeFactory,
337-
nodeFactory.objectNode());
344+
stack, nodeFactory.objectNode());
338345
break;
339346
case JsonTokenId.ID_START_ARRAY:
340347
// Ok to do one level of recursion:
341-
value = deserializeArray(p, ctxt, nodeFactory);
342-
break;
343-
case JsonTokenId.ID_EMBEDDED_OBJECT:
344-
value = _fromEmbedded(p, ctxt, nodeFactory);
348+
value = deserializeArray(p, ctxt, nodeFactory, stack);
345349
break;
346350
case JsonTokenId.ID_STRING:
347351
value = nodeFactory.textNode(p.getText());
@@ -359,7 +363,7 @@ protected final ObjectNode deserializeObjectAtName(JsonParser p, Deserialization
359363
value = nodeFactory.nullNode();
360364
break;
361365
default:
362-
value = deserializeAny(p, ctxt, nodeFactory);
366+
value = deserializeRareScalar(p, ctxt);
363367
}
364368
JsonNode old = node.replace(key, value);
365369
if (old != null) {
@@ -388,6 +392,7 @@ protected final JsonNode updateObject(JsonParser p, DeserializationContext ctxt,
388392
}
389393
key = p.currentName();
390394
}
395+
final ContainerStack stack = new ContainerStack();
391396
for (; key != null; key = p.nextFieldName()) {
392397
// If not, fall through to regular handling
393398
JsonToken t = p.nextToken();
@@ -424,13 +429,10 @@ protected final JsonNode updateObject(JsonParser p, DeserializationContext ctxt,
424429
JsonNodeFactory nodeFactory = ctxt.getNodeFactory();
425430
switch (t.id()) {
426431
case JsonTokenId.ID_START_OBJECT:
427-
value = deserializeObject(p, ctxt, nodeFactory);
432+
value = deserializeObject(p, ctxt, nodeFactory, stack);
428433
break;
429434
case JsonTokenId.ID_START_ARRAY:
430-
value = deserializeArray(p, ctxt, nodeFactory);
431-
break;
432-
case JsonTokenId.ID_EMBEDDED_OBJECT:
433-
value = _fromEmbedded(p, ctxt, nodeFactory);
435+
value = deserializeArray(p, ctxt, nodeFactory, stack);
434436
break;
435437
case JsonTokenId.ID_STRING:
436438
value = nodeFactory.textNode(p.getText());
@@ -448,7 +450,7 @@ protected final JsonNode updateObject(JsonParser p, DeserializationContext ctxt,
448450
value = nodeFactory.nullNode();
449451
break;
450452
default:
451-
value = deserializeAny(p, ctxt, nodeFactory);
453+
value = deserializeRareScalar(p, ctxt);
452454
}
453455
// 15-Feb-2021, tatu: I don't think this should have been called
454456
// on update case (was until 2.12.2) and was simply result of
@@ -465,7 +467,7 @@ protected final JsonNode updateObject(JsonParser p, DeserializationContext ctxt,
465467
}
466468

467469
protected final ArrayNode deserializeArray(JsonParser p, DeserializationContext ctxt,
468-
final JsonNodeFactory nodeFactory) throws IOException
470+
final JsonNodeFactory nodeFactory, final ContainerStack stack) throws IOException
469471
{
470472
ArrayNode node = nodeFactory.arrayNode();
471473
JsonToken t;
@@ -475,18 +477,15 @@ protected final ArrayNode deserializeArray(JsonParser p, DeserializationContext
475477
case JsonTokenId.ID_START_OBJECT:
476478
// Need to avoid deep recursion, so:
477479
node.add(deserializeContainerNonRecursive(p, ctxt, nodeFactory,
478-
nodeFactory.objectNode()));
480+
stack, nodeFactory.objectNode()));
479481
break;
480482
case JsonTokenId.ID_START_ARRAY:
481483
// Need to avoid deep recursion, so:
482484
node.add(deserializeContainerNonRecursive(p, ctxt, nodeFactory,
483-
nodeFactory.arrayNode()));
485+
stack, nodeFactory.arrayNode()));
484486
break;
485487
case JsonTokenId.ID_END_ARRAY:
486488
return node;
487-
case JsonTokenId.ID_EMBEDDED_OBJECT:
488-
node.add(_fromEmbedded(p, ctxt, nodeFactory));
489-
break;
490489
case JsonTokenId.ID_STRING:
491490
node.add(nodeFactory.textNode(p.getText()));
492491
break;
@@ -503,7 +502,7 @@ protected final ArrayNode deserializeArray(JsonParser p, DeserializationContext
503502
node.add(nodeFactory.nullNode());
504503
break;
505504
default:
506-
node.add(deserializeAny(p, ctxt, nodeFactory));
505+
node.add(deserializeRareScalar(p, ctxt));
507506
break;
508507
}
509508
}
@@ -519,20 +518,18 @@ protected final JsonNode updateArray(JsonParser p, DeserializationContext ctxt,
519518
final ArrayNode node) throws IOException
520519
{
521520
final JsonNodeFactory nodeFactory = ctxt.getNodeFactory();
521+
final ContainerStack stack = new ContainerStack();
522522
while (true) {
523523
JsonToken t = p.nextToken();
524524
switch (t.id()) {
525525
case JsonTokenId.ID_START_OBJECT:
526-
node.add(deserializeObject(p, ctxt, nodeFactory));
526+
node.add(deserializeObject(p, ctxt, nodeFactory, stack));
527527
break;
528528
case JsonTokenId.ID_START_ARRAY:
529-
node.add(deserializeArray(p, ctxt, nodeFactory));
529+
node.add(deserializeArray(p, ctxt, nodeFactory, stack));
530530
break;
531531
case JsonTokenId.ID_END_ARRAY:
532532
return node;
533-
case JsonTokenId.ID_EMBEDDED_OBJECT:
534-
node.add(_fromEmbedded(p, ctxt, nodeFactory));
535-
break;
536533
case JsonTokenId.ID_STRING:
537534
node.add(nodeFactory.textNode(p.getText()));
538535
break;
@@ -549,48 +546,54 @@ protected final JsonNode updateArray(JsonParser p, DeserializationContext ctxt,
549546
node.add(nodeFactory.nullNode());
550547
break;
551548
default:
552-
node.add(deserializeAny(p, ctxt, nodeFactory));
549+
node.add(deserializeRareScalar(p, ctxt));
553550
break;
554551
}
555552
}
556553
}
557554

558-
protected final JsonNode deserializeAny(JsonParser p, DeserializationContext ctxt,
559-
final JsonNodeFactory nodeFactory) throws IOException
555+
// Was called "deserializeAny()" in 2.12 and prior
556+
protected final JsonNode deserializeAnyScalar(JsonParser p, DeserializationContext ctxt)
557+
throws IOException
560558
{
559+
final JsonNodeFactory nodeF = ctxt.getNodeFactory();
561560
switch (p.currentTokenId()) {
562-
case JsonTokenId.ID_END_OBJECT: // for empty JSON Objects we may point to this?
563-
return nodeFactory.objectNode();
564-
case JsonTokenId.ID_FIELD_NAME:
565-
return deserializeObjectAtName(p, ctxt, nodeFactory);
566-
case JsonTokenId.ID_EMBEDDED_OBJECT:
567-
return _fromEmbedded(p, ctxt, nodeFactory);
561+
case JsonTokenId.ID_END_OBJECT:
562+
return nodeF.objectNode();
568563
case JsonTokenId.ID_STRING:
569-
return nodeFactory.textNode(p.getText());
564+
return nodeF.textNode(p.getText());
570565
case JsonTokenId.ID_NUMBER_INT:
571-
return _fromInt(p, ctxt, nodeFactory);
566+
return _fromInt(p, ctxt, nodeF);
572567
case JsonTokenId.ID_NUMBER_FLOAT:
573-
return _fromFloat(p, ctxt, nodeFactory);
568+
return _fromFloat(p, ctxt);
574569
case JsonTokenId.ID_TRUE:
575-
return nodeFactory.booleanNode(true);
570+
return nodeF.booleanNode(true);
576571
case JsonTokenId.ID_FALSE:
577-
return nodeFactory.booleanNode(false);
572+
return nodeF.booleanNode(false);
578573
case JsonTokenId.ID_NULL:
579-
return nodeFactory.nullNode();
574+
return nodeF.nullNode();
575+
case JsonTokenId.ID_EMBEDDED_OBJECT:
576+
return _fromEmbedded(p, ctxt);
580577

581-
/* Caller checks for these, should not get here ever
582-
case JsonTokenId.ID_START_OBJECT:
583-
return deserializeObject(p, ctxt, nodeFactory);
584-
case JsonTokenId.ID_START_ARRAY:
585-
return deserializeArray(p, ctxt, nodeFactory);
586-
*/
578+
// Caller should check for anything else
579+
default:
580+
}
581+
return (JsonNode) ctxt.handleUnexpectedToken(handledType(), p);
582+
}
587583

588-
589-
// These states cannot be mapped; input stream is
590-
// off by an event or two
584+
protected final JsonNode deserializeRareScalar(JsonParser p, DeserializationContext ctxt)
585+
throws IOException
586+
{
587+
// 28-Mar-2021, tatu: Only things that caller does not check
588+
switch (p.currentTokenId()) {
589+
case JsonTokenId.ID_END_OBJECT: // for empty JSON Objects we may point to this?
590+
return ctxt.getNodeFactory().objectNode();
591+
case JsonTokenId.ID_NUMBER_FLOAT:
592+
return _fromFloat(p, ctxt);
593+
case JsonTokenId.ID_EMBEDDED_OBJECT:
594+
return _fromEmbedded(p, ctxt);
591595

592-
//case END_OBJECT:
593-
//case END_ARRAY:
596+
// Caller should check for anything else
594597
default:
595598
}
596599
return (JsonNode) ctxt.handleUnexpectedToken(handledType(), p);
@@ -599,11 +602,10 @@ protected final JsonNode deserializeAny(JsonParser p, DeserializationContext ctx
599602
// Non-recursive alternative, used beyond certain nesting level
600603
// @since 2.13.0
601604
protected final ContainerNode<?> deserializeContainerNonRecursive(JsonParser p, DeserializationContext ctxt,
602-
JsonNodeFactory nodeFactory, ContainerNode<?> root) throws IOException
605+
JsonNodeFactory nodeFactory, ContainerStack stack, ContainerNode<?> root)
606+
throws IOException
603607
{
604608
ContainerNode<?> curr = root;
605-
// Explicit stack of scopes to avoid recursive calls
606-
final ContainerStack stack = new ContainerStack();
607609

608610
outer_loop:
609611
while (true) {
@@ -625,9 +627,6 @@ protected final ContainerNode<?> deserializeContainerNonRecursive(JsonParser p,
625627
case JsonTokenId.ID_START_ARRAY:
626628
value = newContainer = nodeFactory.arrayNode();
627629
break;
628-
case JsonTokenId.ID_EMBEDDED_OBJECT:
629-
value = _fromEmbedded(p, ctxt, nodeFactory);
630-
break;
631630
case JsonTokenId.ID_STRING:
632631
value = nodeFactory.textNode(p.getText());
633632
break;
@@ -644,7 +643,7 @@ protected final ContainerNode<?> deserializeContainerNonRecursive(JsonParser p,
644643
value = nodeFactory.nullNode();
645644
break;
646645
default:
647-
value = deserializeAny(p, ctxt, nodeFactory);
646+
value = deserializeRareScalar(p, ctxt);
648647
}
649648
JsonNode old = currObject.replace(propName, value);
650649
if (old != null) {
@@ -678,9 +677,6 @@ protected final ContainerNode<?> deserializeContainerNonRecursive(JsonParser p,
678677
continue outer_loop;
679678
case JsonTokenId.ID_END_ARRAY:
680679
break arrayLoop;
681-
case JsonTokenId.ID_EMBEDDED_OBJECT:
682-
currArray.add(_fromEmbedded(p, ctxt, nodeFactory));
683-
break;
684680
case JsonTokenId.ID_STRING:
685681
currArray.add(nodeFactory.textNode(p.getText()));
686682
break;
@@ -697,7 +693,7 @@ protected final ContainerNode<?> deserializeContainerNonRecursive(JsonParser p,
697693
currArray.add(nodeFactory.nullNode());
698694
break;
699695
default:
700-
currArray.add(deserializeAny(p, ctxt, nodeFactory));
696+
currArray.add(deserializeRareScalar(p, ctxt));
701697
break;
702698
}
703699
}
@@ -735,9 +731,10 @@ protected final JsonNode _fromInt(JsonParser p, DeserializationContext ctxt,
735731
return nodeFactory.numberNode(p.getBigIntegerValue());
736732
}
737733

738-
protected final JsonNode _fromFloat(JsonParser p, DeserializationContext ctxt,
739-
final JsonNodeFactory nodeFactory) throws IOException
734+
protected final JsonNode _fromFloat(JsonParser p, DeserializationContext ctxt)
735+
throws IOException
740736
{
737+
final JsonNodeFactory nodeFactory = ctxt.getNodeFactory();
741738
JsonParser.NumberType nt = p.getNumberType();
742739
if (nt == JsonParser.NumberType.BIG_DECIMAL) {
743740
return nodeFactory.numberNode(p.getDecimalValue());
@@ -756,27 +753,29 @@ protected final JsonNode _fromFloat(JsonParser p, DeserializationContext ctxt,
756753
return nodeFactory.numberNode(p.getDoubleValue());
757754
}
758755

759-
protected final JsonNode _fromEmbedded(JsonParser p, DeserializationContext ctxt,
760-
JsonNodeFactory nodeFactory) throws IOException
756+
protected final JsonNode _fromEmbedded(JsonParser p, DeserializationContext ctxt)
757+
throws IOException
761758
{
762-
Object ob = p.getEmbeddedObject();
759+
final JsonNodeFactory nodeF = ctxt.getNodeFactory();
760+
final Object ob = p.getEmbeddedObject();
761+
763762
if (ob == null) { // should this occur?
764-
return nodeFactory.nullNode();
763+
return nodeF.nullNode();
765764
}
766765
Class<?> type = ob.getClass();
767766
if (type == byte[].class) { // most common special case
768-
return nodeFactory.binaryNode((byte[]) ob);
767+
return nodeF.binaryNode((byte[]) ob);
769768
}
770769
// [databind#743]: Don't forget RawValue
771770
if (ob instanceof RawValue) {
772-
return nodeFactory.rawValueNode((RawValue) ob);
771+
return nodeF.rawValueNode((RawValue) ob);
773772
}
774773
if (ob instanceof JsonNode) {
775774
// [databind#433]: but could also be a JsonNode hiding in there!
776775
return (JsonNode) ob;
777776
}
778777
// any other special handling needed?
779-
return nodeFactory.pojoNode(ob);
778+
return nodeF.pojoNode(ob);
780779
}
781780

782781
/*

0 commit comments

Comments
 (0)