@@ -329,6 +329,8 @@ public Object deserializeFromObject(JsonParser p, DeserializationContext ctxt)
329
329
* values for creator method need to be buffered, first; and
330
330
* due to non-guaranteed ordering possibly some other properties
331
331
* as well.
332
+ *
333
+ * @return Builder instance constructed
332
334
*/
333
335
@ Override
334
336
@ SuppressWarnings ("resource" )
@@ -357,22 +359,22 @@ protected final Object _deserializeUsingPropertyBased(final JsonParser p,
357
359
// Last creator property to set?
358
360
if (buffer .assignParameter (creatorProp , creatorProp .deserialize (p , ctxt ))) {
359
361
p .nextToken (); // to move to following FIELD_NAME/END_OBJECT
360
- Object bean ;
362
+ Object builder ;
361
363
try {
362
- bean = creator .build (ctxt , buffer );
364
+ builder = creator .build (ctxt , buffer );
363
365
} catch (Exception e ) {
364
366
wrapAndThrow (e , _beanType .getRawClass (), propName , ctxt );
365
367
continue ; // never gets here
366
368
}
367
369
// polymorphic?
368
- if (bean .getClass () != _beanType .getRawClass ()) {
369
- return handlePolymorphic (p , ctxt , bean , unknown );
370
+ if (builder .getClass () != _beanType .getRawClass ()) {
371
+ return handlePolymorphic (p , ctxt , builder , unknown );
370
372
}
371
373
if (unknown != null ) { // nope, just extra unknown stuff...
372
- bean = handleUnknownProperties (ctxt , bean , unknown );
374
+ builder = handleUnknownProperties (ctxt , builder , unknown );
373
375
}
374
376
// or just clean?
375
- return _deserialize (p , ctxt , bean );
377
+ return _deserialize (p , ctxt , builder );
376
378
}
377
379
continue ;
378
380
}
@@ -406,31 +408,37 @@ protected final Object _deserializeUsingPropertyBased(final JsonParser p,
406
408
}
407
409
408
410
// We hit END_OBJECT, so:
409
- Object bean ;
411
+ Object builder ;
410
412
try {
411
- bean = creator .build (ctxt , buffer );
413
+ builder = creator .build (ctxt , buffer );
412
414
} catch (Exception e ) {
413
- bean = wrapInstantiationProblem (e , ctxt );
415
+ builder = wrapInstantiationProblem (e , ctxt );
414
416
}
415
417
if (unknown != null ) {
416
418
// polymorphic?
417
- if (bean .getClass () != _beanType .getRawClass ()) {
418
- return handlePolymorphic (null , ctxt , bean , unknown );
419
+ if (builder .getClass () != _beanType .getRawClass ()) {
420
+ return handlePolymorphic (null , ctxt , builder , unknown );
419
421
}
420
422
// no, just some extra unknown properties
421
- return handleUnknownProperties (ctxt , bean , unknown );
423
+ return handleUnknownProperties (ctxt , builder , unknown );
422
424
}
423
- return bean ;
425
+ return builder ;
424
426
}
425
427
428
+ @ SuppressWarnings ("resource" )
426
429
protected final Object _deserialize (JsonParser p ,
427
430
DeserializationContext ctxt , Object builder ) throws IOException
428
431
{
429
432
if (_injectables != null ) {
430
433
injectValues (ctxt , builder );
431
434
}
432
435
if (_unwrappedPropertyHandler != null ) {
433
- return deserializeWithUnwrapped (p , ctxt , builder );
436
+ if (p .hasToken (JsonToken .START_OBJECT )) {
437
+ p .nextToken ();
438
+ }
439
+ TokenBuffer tokens = new TokenBuffer (p , ctxt );
440
+ tokens .writeStartObject ();
441
+ return deserializeWithUnwrapped (p , ctxt , builder , tokens );
434
442
}
435
443
if (_externalTypeIdHandler != null ) {
436
444
return deserializeWithExternalTypeId (p , ctxt , builder );
@@ -563,53 +571,7 @@ protected Object deserializeWithUnwrapped(JsonParser p, DeserializationContext c
563
571
}
564
572
}
565
573
tokens .writeEndObject ();
566
- _unwrappedPropertyHandler .processUnwrapped (p , ctxt , bean , tokens );
567
- return bean ;
568
- }
569
-
570
- @ SuppressWarnings ("resource" )
571
- protected Object deserializeWithUnwrapped (JsonParser p ,
572
- DeserializationContext ctxt , Object bean )
573
- throws IOException
574
- {
575
- JsonToken t = p .getCurrentToken ();
576
- if (t == JsonToken .START_OBJECT ) {
577
- t = p .nextToken ();
578
- }
579
- TokenBuffer tokens = new TokenBuffer (p , ctxt );
580
- tokens .writeStartObject ();
581
- final Class <?> activeView = _needViewProcesing ? ctxt .getActiveView () : null ;
582
- for (; t == JsonToken .FIELD_NAME ; t = p .nextToken ()) {
583
- String propName = p .getCurrentName ();
584
- SettableBeanProperty prop = _beanProperties .find (propName );
585
- p .nextToken ();
586
- if (prop != null ) { // normal case
587
- if (activeView != null && !prop .visibleInView (activeView )) {
588
- p .skipChildren ();
589
- continue ;
590
- }
591
- try {
592
- bean = prop .deserializeSetAndReturn (p , ctxt , bean );
593
- } catch (Exception e ) {
594
- wrapAndThrow (e , bean , propName , ctxt );
595
- }
596
- continue ;
597
- }
598
- if (_ignorableProps != null && _ignorableProps .contains (propName )) {
599
- handleIgnoredProperty (p , ctxt , bean , propName );
600
- continue ;
601
- }
602
- // but... others should be passed to unwrapped property deserializers
603
- tokens .writeFieldName (propName );
604
- tokens .copyCurrentStructure (p );
605
- // how about any setter? We'll get copies but...
606
- if (_anySetter != null ) {
607
- _anySetter .deserializeAndSet (p , ctxt , bean , propName );
608
- }
609
- }
610
- tokens .writeEndObject ();
611
- _unwrappedPropertyHandler .processUnwrapped (p , ctxt , bean , tokens );
612
- return bean ;
574
+ return _unwrappedPropertyHandler .processUnwrapped (p , ctxt , bean , tokens );
613
575
}
614
576
615
577
@ SuppressWarnings ("resource" )
@@ -622,6 +584,7 @@ protected Object deserializeUsingPropertyBasedWithUnwrapped(JsonParser p,
622
584
623
585
TokenBuffer tokens = new TokenBuffer (p , ctxt );
624
586
tokens .writeStartObject ();
587
+ Object builder = null ;
625
588
626
589
JsonToken t = p .getCurrentToken ();
627
590
for (; t == JsonToken .FIELD_NAME ; t = p .nextToken ()) {
@@ -630,38 +593,20 @@ protected Object deserializeUsingPropertyBasedWithUnwrapped(JsonParser p,
630
593
// creator property?
631
594
SettableBeanProperty creatorProp = creator .findCreatorProperty (propName );
632
595
if (creatorProp != null ) {
633
- // 27-Mar-2017, tatu: As per [databind#1573], can not short-circuit
634
- // here because assignments are to be done via Builder, and
635
- // not value object.
636
- buffer .assignParameter (creatorProp , creatorProp .deserialize (p , ctxt ));
637
- /*
638
596
// Last creator property to set?
639
597
if (buffer .assignParameter (creatorProp , creatorProp .deserialize (p , ctxt ))) {
640
598
t = p .nextToken (); // to move to following FIELD_NAME/END_OBJECT
641
- Object bean;
642
599
try {
643
- bean = creator.build(ctxt, buffer);
600
+ builder = creator .build (ctxt , buffer );
644
601
} catch (Exception e ) {
645
602
wrapAndThrow (e , _beanType .getRawClass (), propName , ctxt );
646
603
continue ; // never gets here
647
604
}
648
- // if so, need to copy all remaining tokens into buffer
649
- while (t == JsonToken.FIELD_NAME) {
650
- p.nextToken(); // to skip name
651
- tokens.copyCurrentStructure(p);
652
- t = p.nextToken();
653
- }
654
- tokens.writeEndObject();
655
- if (bean.getClass() != _beanType.getRawClass()) {
656
- // !!! 08-Jul-2011, tatu: Could probably support; but for now
657
- // it's too complicated, so bail out
658
- ctxt.reportInputMismatch(creatorProp,
659
- "Can not create polymorphic instances with unwrapped values");
660
- return null;
605
+ if (builder .getClass () != _beanType .getRawClass ()) {
606
+ return handlePolymorphic (p , ctxt , builder , tokens );
661
607
}
662
- return _unwrappedPropertyHandler.processUnwrapped (p, ctxt, bean , tokens);
608
+ return deserializeWithUnwrapped (p , ctxt , builder , tokens );
663
609
}
664
- */
665
610
continue ;
666
611
}
667
612
// Object Id property?
@@ -685,15 +630,52 @@ protected Object deserializeUsingPropertyBasedWithUnwrapped(JsonParser p,
685
630
buffer .bufferAnyProperty (_anySetter , propName , _anySetter .deserialize (p , ctxt ));
686
631
}
687
632
}
688
-
689
633
// We hit END_OBJECT, so:
690
- Object bean ;
691
- try {
692
- bean = creator .build (ctxt , buffer );
693
- } catch (Exception e ) {
694
- return wrapInstantiationProblem (e , ctxt );
634
+ if (builder == null ) {
635
+ try {
636
+ builder = creator .build (ctxt , buffer );
637
+ } catch (Exception e ) {
638
+ return wrapInstantiationProblem (e , ctxt );
639
+ }
695
640
}
696
- return _unwrappedPropertyHandler .processUnwrapped (p , ctxt , bean , tokens );
641
+ return _unwrappedPropertyHandler .processUnwrapped (p , ctxt , builder , tokens );
642
+ }
643
+
644
+ protected Object deserializeWithUnwrapped (JsonParser p ,
645
+ DeserializationContext ctxt , Object builder , TokenBuffer tokens )
646
+ throws IOException
647
+ {
648
+ final Class <?> activeView = _needViewProcesing ? ctxt .getActiveView () : null ;
649
+ for (JsonToken t = p .getCurrentToken (); t == JsonToken .FIELD_NAME ; t = p .nextToken ()) {
650
+ String propName = p .getCurrentName ();
651
+ SettableBeanProperty prop = _beanProperties .find (propName );
652
+ p .nextToken ();
653
+ if (prop != null ) { // normal case
654
+ if (activeView != null && !prop .visibleInView (activeView )) {
655
+ p .skipChildren ();
656
+ continue ;
657
+ }
658
+ try {
659
+ builder = prop .deserializeSetAndReturn (p , ctxt , builder );
660
+ } catch (Exception e ) {
661
+ wrapAndThrow (e , builder , propName , ctxt );
662
+ }
663
+ continue ;
664
+ }
665
+ if (_ignorableProps != null && _ignorableProps .contains (propName )) {
666
+ handleIgnoredProperty (p , ctxt , builder , propName );
667
+ continue ;
668
+ }
669
+ // but... others should be passed to unwrapped property deserializers
670
+ tokens .writeFieldName (propName );
671
+ tokens .copyCurrentStructure (p );
672
+ // how about any setter? We'll get copies but...
673
+ if (_anySetter != null ) {
674
+ _anySetter .deserializeAndSet (p , ctxt , builder , propName );
675
+ }
676
+ }
677
+ tokens .writeEndObject ();
678
+ return _unwrappedPropertyHandler .processUnwrapped (p , ctxt , builder , tokens );
697
679
}
698
680
699
681
/*
@@ -724,7 +706,7 @@ protected Object deserializeWithExternalTypeId(JsonParser p,
724
706
t = p .nextToken ();
725
707
SettableBeanProperty prop = _beanProperties .find (propName );
726
708
if (prop != null ) { // normal case
727
- // [JACKSON-831]: may have property AND be used as external type id:
709
+ // May have property AND be used as external type id:
728
710
if (t .isScalarValue ()) {
729
711
ext .handleTypePropertyValue (p , ctxt , propName , bean );
730
712
}
0 commit comments