Skip to content

Commit 7b9e7dd

Browse files
committed
Complete adding "scalar-from-Object" for all basic scalar types
1 parent 52ee6f0 commit 7b9e7dd

File tree

2 files changed

+86
-8
lines changed

2 files changed

+86
-8
lines changed

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

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,10 @@ protected Byte _parseByte(JsonParser p, DeserializationContext ctxt)
297297
return p.getByteValue();
298298
case JsonTokenId.ID_START_ARRAY:
299299
return (Byte) _deserializeFromArray(p, ctxt);
300+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
301+
case JsonTokenId.ID_START_OBJECT:
302+
text = ctxt.extractScalarFromObject(p, this, _valueClass);
303+
break;
300304
default:
301305
return (Byte) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
302306
}
@@ -379,11 +383,16 @@ protected Short _parseShort(JsonParser p, DeserializationContext ctxt)
379383
return (Short) getNullValue(ctxt);
380384
case JsonTokenId.ID_NUMBER_INT:
381385
return p.getShortValue();
386+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
387+
case JsonTokenId.ID_START_OBJECT:
388+
text = ctxt.extractScalarFromObject(p, this, _valueClass);
389+
break;
382390
case JsonTokenId.ID_START_ARRAY:
383391
return (Short)_deserializeFromArray(p, ctxt);
384392
default:
385393
return (Short) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
386394
}
395+
387396
// Rest of the processing is for coercion from String
388397
final CoercionAction act = _checkFromStringCoercion(ctxt, text);
389398
if (act == CoercionAction.AsNull) {
@@ -463,11 +472,16 @@ public Character deserialize(JsonParser p, DeserializationContext ctxt)
463472
_verifyNullForPrimitive(ctxt);
464473
}
465474
return (Character) getNullValue(ctxt);
475+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
476+
case JsonTokenId.ID_START_OBJECT:
477+
text = ctxt.extractScalarFromObject(p, this, _valueClass);
478+
break;
466479
case JsonTokenId.ID_START_ARRAY:
467480
return _deserializeFromArray(p, ctxt);
468481
default:
469482
return (Character) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
470483
}
484+
471485
if (text.length() == 1) {
472486
return Character.valueOf(text.charAt(0));
473487
}
@@ -551,6 +565,10 @@ protected final Integer _parseInteger(JsonParser p, DeserializationContext ctxt)
551565
return p.getIntValue();
552566
case JsonTokenId.ID_NULL: // null fine for non-primitive
553567
return (Integer) getNullValue(ctxt);
568+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
569+
case JsonTokenId.ID_START_OBJECT:
570+
text = ctxt.extractScalarFromObject(p, this, _valueClass);
571+
break;
554572
case JsonTokenId.ID_START_ARRAY:
555573
return (Integer) _deserializeFromArray(p, ctxt);
556574
default:
@@ -621,6 +639,10 @@ protected final Long _parseLong(JsonParser p, DeserializationContext ctxt)
621639
return (Long) getNullValue(ctxt);
622640
case JsonTokenId.ID_NUMBER_INT:
623641
return p.getLongValue();
642+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
643+
case JsonTokenId.ID_START_OBJECT:
644+
text = ctxt.extractScalarFromObject(p, this, _valueClass);
645+
break;
624646
case JsonTokenId.ID_START_ARRAY:
625647
return (Long) _deserializeFromArray(p, ctxt);
626648
default:
@@ -681,11 +703,16 @@ protected final Float _parseFloat(JsonParser p, DeserializationContext ctxt)
681703
case JsonTokenId.ID_NUMBER_FLOAT:
682704
case JsonTokenId.ID_NUMBER_INT: // safe coercion
683705
return p.getFloatValue();
706+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
707+
case JsonTokenId.ID_START_OBJECT:
708+
text = ctxt.extractScalarFromObject(p, this, _valueClass);
709+
break;
684710
case JsonTokenId.ID_START_ARRAY:
685711
return _deserializeFromArray(p, ctxt);
686712
default:
687-
return (Float) ctxt.handleUnexpectedToken(_valueClass, p);
713+
return (Float) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
688714
}
715+
689716
final CoercionAction act = _checkFromStringCoercion(ctxt, text);
690717
if (act == CoercionAction.AsNull) {
691718
return (Float) getNullValue(ctxt);
@@ -773,10 +800,14 @@ protected final Double _parseDouble(JsonParser p, DeserializationContext ctxt) t
773800
case JsonTokenId.ID_NUMBER_FLOAT:
774801
case JsonTokenId.ID_NUMBER_INT: // safe coercion
775802
return p.getDoubleValue();
803+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
804+
case JsonTokenId.ID_START_OBJECT:
805+
text = ctxt.extractScalarFromObject(p, this, _valueClass);
806+
break;
776807
case JsonTokenId.ID_START_ARRAY:
777808
return _deserializeFromArray(p, ctxt);
778809
default:
779-
return (Double) ctxt.handleUnexpectedToken(_valueClass, p);
810+
return (Double) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
780811
}
781812

782813
// Coercion from String most complicated
@@ -865,10 +896,14 @@ public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOEx
865896
}
866897
}
867898
return p.getNumberValue();
899+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
900+
case JsonTokenId.ID_START_OBJECT:
901+
text = ctxt.extractScalarFromObject(p, this, _valueClass);
902+
break;
868903
case JsonTokenId.ID_START_ARRAY:
869904
return _deserializeFromArray(p, ctxt);
870905
default:
871-
return ctxt.handleUnexpectedToken(_valueClass, p);
906+
return ctxt.handleUnexpectedToken(getValueType(ctxt), p);
872907
}
873908

874909
// Textual values are more difficult... not parsing itself, but figuring
@@ -989,11 +1024,15 @@ public BigInteger deserialize(JsonParser p, DeserializationContext ctxt) throws
9891024
return (BigInteger) getEmptyValue(ctxt);
9901025
}
9911026
return p.getDecimalValue().toBigInteger();
1027+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
1028+
case JsonTokenId.ID_START_OBJECT:
1029+
text = ctxt.extractScalarFromObject(p, this, _valueClass);
1030+
break;
9921031
case JsonTokenId.ID_START_ARRAY:
9931032
return _deserializeFromArray(p, ctxt);
9941033
default:
9951034
// String is ok too, can easily convert; otherwise, no can do:
996-
return (BigInteger) ctxt.handleUnexpectedToken(_valueClass, p);
1035+
return (BigInteger) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
9971036
}
9981037

9991038
final CoercionAction act = _checkFromStringCoercion(ctxt, text);
@@ -1047,10 +1086,14 @@ public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt)
10471086
case JsonTokenId.ID_STRING:
10481087
text = p.getText();
10491088
break;
1089+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
1090+
case JsonTokenId.ID_START_OBJECT:
1091+
text = ctxt.extractScalarFromObject(p, this, _valueClass);
1092+
break;
10501093
case JsonTokenId.ID_START_ARRAY:
10511094
return _deserializeFromArray(p, ctxt);
10521095
default:
1053-
return (BigDecimal) ctxt.handleUnexpectedToken(_valueClass, p);
1096+
return (BigDecimal) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
10541097
}
10551098

10561099
final CoercionAction act = _checkFromStringCoercion(ctxt, text);

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

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,10 @@ protected final boolean _parseBooleanPrimitive(JsonParser p, DeserializationCont
387387
case JsonTokenId.ID_NULL: // null fine for non-primitive
388388
_verifyNullForPrimitive(ctxt);
389389
return false;
390+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
391+
case JsonTokenId.ID_START_OBJECT:
392+
text = ctxt.extractScalarFromObject(p, this, Boolean.TYPE);
393+
break;
390394
case JsonTokenId.ID_START_ARRAY:
391395
// 12-Jun-2020, tatu: For some reason calling `_deserializeFromArray()` won't work so:
392396
if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) {
@@ -491,6 +495,10 @@ protected final Boolean _parseBoolean(JsonParser p, DeserializationContext ctxt,
491495
return false;
492496
case JsonTokenId.ID_NULL: // null fine for non-primitive
493497
return null;
498+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
499+
case JsonTokenId.ID_START_OBJECT:
500+
text = ctxt.extractScalarFromObject(p, this, targetType);
501+
break;
494502
case JsonTokenId.ID_START_ARRAY: // unwrapping / from-empty-array coercion?
495503
return (Boolean) _deserializeFromArray(p, ctxt);
496504
default:
@@ -548,6 +556,10 @@ protected final byte _parseBytePrimitive(JsonParser p, DeserializationContext ct
548556
case JsonTokenId.ID_NULL:
549557
_verifyNullForPrimitive(ctxt);
550558
return (byte) 0;
559+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
560+
case JsonTokenId.ID_START_OBJECT:
561+
text = ctxt.extractScalarFromObject(p, this, Byte.TYPE);
562+
break;
551563
case JsonTokenId.ID_START_ARRAY: // unwrapping / from-empty-array coercion?
552564
// 12-Jun-2020, tatu: For some reason calling `_deserializeFromArray()` won't work so:
553565
if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) {
@@ -612,6 +624,10 @@ protected final short _parseShortPrimitive(JsonParser p, DeserializationContext
612624
case JsonTokenId.ID_NULL:
613625
_verifyNullForPrimitive(ctxt);
614626
return (short) 0;
627+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
628+
case JsonTokenId.ID_START_OBJECT:
629+
text = ctxt.extractScalarFromObject(p, this, Short.TYPE);
630+
break;
615631
case JsonTokenId.ID_START_ARRAY:
616632
// 12-Jun-2020, tatu: For some reason calling `_deserializeFromArray()` won't work so:
617633
if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) {
@@ -674,9 +690,7 @@ protected final int _parseIntPrimitive(JsonParser p, DeserializationContext ctxt
674690
case JsonTokenId.ID_NULL:
675691
_verifyNullForPrimitive(ctxt);
676692
return 0;
677-
678-
// 29-Jun-2020, tatu: New! "Scalar from Object" to support tricky case of
679-
// XML element with attributes
693+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
680694
case JsonTokenId.ID_START_OBJECT:
681695
text = ctxt.extractScalarFromObject(p, this, Integer.TYPE);
682696
break;
@@ -754,6 +768,10 @@ protected final long _parseLongPrimitive(JsonParser p, DeserializationContext ct
754768
case JsonTokenId.ID_NULL:
755769
_verifyNullForPrimitive(ctxt);
756770
return 0L;
771+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
772+
case JsonTokenId.ID_START_OBJECT:
773+
text = ctxt.extractScalarFromObject(p, this, Long.TYPE);
774+
break;
757775
case JsonTokenId.ID_START_ARRAY:
758776
if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) {
759777
p.nextToken();
@@ -811,6 +829,10 @@ protected final float _parseFloatPrimitive(JsonParser p, DeserializationContext
811829
case JsonTokenId.ID_NULL:
812830
_verifyNullForPrimitive(ctxt);
813831
return 0f;
832+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
833+
case JsonTokenId.ID_START_OBJECT:
834+
text = ctxt.extractScalarFromObject(p, this, Float.TYPE);
835+
break;
814836
case JsonTokenId.ID_START_ARRAY:
815837
if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) {
816838
p.nextToken();
@@ -882,6 +904,10 @@ protected final double _parseDoublePrimitive(JsonParser p, DeserializationContex
882904
case JsonTokenId.ID_NULL:
883905
_verifyNullForPrimitive(ctxt);
884906
return 0.0;
907+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
908+
case JsonTokenId.ID_START_OBJECT:
909+
text = ctxt.extractScalarFromObject(p, this, Double.TYPE);
910+
break;
885911
case JsonTokenId.ID_START_ARRAY:
886912
if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) {
887913
p.nextToken();
@@ -978,6 +1004,10 @@ protected java.util.Date _parseDate(JsonParser p, DeserializationContext ctxt)
9781004
}
9791005
case JsonTokenId.ID_NULL:
9801006
return (java.util.Date) getNullValue(ctxt);
1007+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
1008+
case JsonTokenId.ID_START_OBJECT:
1009+
text = ctxt.extractScalarFromObject(p, this, _valueClass);
1010+
break;
9811011
case JsonTokenId.ID_START_ARRAY:
9821012
return _parseDateFromArray(p, ctxt);
9831013
default:
@@ -1068,6 +1098,11 @@ protected final String _parseString(JsonParser p, DeserializationContext ctxt) t
10681098
// otherwise, try conversion using toString()...
10691099
return ob.toString();
10701100
}
1101+
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
1102+
if (p.hasToken(JsonToken.START_OBJECT)) {
1103+
return ctxt.extractScalarFromObject(p, this, _valueClass);
1104+
}
1105+
10711106
String value = p.getValueAsString();
10721107
if (value != null) {
10731108
return value;

0 commit comments

Comments
 (0)