Skip to content

Commit ca6c3fc

Browse files
committed
Fix #965
1 parent 16aa305 commit ca6c3fc

File tree

11 files changed

+172
-76
lines changed

11 files changed

+172
-76
lines changed

release-notes/VERSION

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ Project: jackson-databind
2424
(contributed by Benson M)
2525
#949: Report the offending substring when number parsing fails
2626
(contributed by Jesse W)
27+
#965: BigDecimal values via @JsonTypeInfo/@JsonSubTypes get rounded
28+
(reported by gmjabs@github)
2729

2830
2.6.2 (14-Sep-2015)
2931

src/main/java/com/fasterxml/jackson/databind/ObjectMapper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2507,6 +2507,9 @@ public <T extends JsonNode> T valueToTree(Object fromValue)
25072507
{
25082508
if (fromValue == null) return null;
25092509
TokenBuffer buf = new TokenBuffer(this, false);
2510+
if (isEnabled(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS)) {
2511+
buf = buf.forceUseOfBigDecimal(true);
2512+
}
25102513
JsonNode result;
25112514
try {
25122515
writeValue(buf, fromValue);
@@ -3423,6 +3426,9 @@ protected Object _convert(Object fromValue, JavaType toValueType)
34233426

34243427
// Then use TokenBuffer, which is a JsonGenerator:
34253428
TokenBuffer buf = new TokenBuffer(this, false);
3429+
if (isEnabled(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS)) {
3430+
buf = buf.forceUseOfBigDecimal(true);
3431+
}
34263432
try {
34273433
// inlined 'writeValue' with minor changes:
34283434
// first: disable wrapping when writing

src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ protected Object _deserializeUsingPropertyBased(final JsonParser p, final Deseri
430430
}
431431
// Ok then, let's collect the whole field; name and value
432432
if (unknown == null) {
433-
unknown = new TokenBuffer(p);
433+
unknown = new TokenBuffer(p, ctxt);
434434
}
435435
unknown.writeFieldName(propName);
436436
unknown.copyCurrentStructure(p);
@@ -522,7 +522,7 @@ protected Object deserializeWithUnwrapped(JsonParser p, DeserializationContext c
522522
if (_propertyBasedCreator != null) {
523523
return deserializeUsingPropertyBasedWithUnwrapped(p, ctxt);
524524
}
525-
TokenBuffer tokens = new TokenBuffer(p);
525+
TokenBuffer tokens = new TokenBuffer(p, ctxt);
526526
tokens.writeStartObject();
527527
final Object bean = _valueInstantiator.createUsingDefault(ctxt);
528528

@@ -581,7 +581,7 @@ protected Object deserializeWithUnwrapped(JsonParser p, DeserializationContext c
581581
if (t == JsonToken.START_OBJECT) {
582582
t = p.nextToken();
583583
}
584-
TokenBuffer tokens = new TokenBuffer(p);
584+
TokenBuffer tokens = new TokenBuffer(p, ctxt);
585585
tokens.writeStartObject();
586586
final Class<?> activeView = _needViewProcesing ? ctxt.getActiveView() : null;
587587
for (; t == JsonToken.FIELD_NAME; t = p.nextToken()) {
@@ -624,7 +624,7 @@ protected Object deserializeUsingPropertyBasedWithUnwrapped(JsonParser p, Deseri
624624
final PropertyBasedCreator creator = _propertyBasedCreator;
625625
PropertyValueBuffer buffer = creator.startBuilding(p, ctxt, _objectIdReader);
626626

627-
TokenBuffer tokens = new TokenBuffer(p);
627+
TokenBuffer tokens = new TokenBuffer(p, ctxt);
628628
tokens.writeStartObject();
629629

630630
JsonToken t = p.getCurrentToken();
@@ -780,7 +780,7 @@ protected Object deserializeUsingPropertyBasedWithExternalTypeId(JsonParser p, D
780780
final PropertyBasedCreator creator = _propertyBasedCreator;
781781
PropertyValueBuffer buffer = creator.startBuilding(p, ctxt, _objectIdReader);
782782

783-
TokenBuffer tokens = new TokenBuffer(p);
783+
TokenBuffer tokens = new TokenBuffer(p, ctxt);
784784
tokens.writeStartObject();
785785

786786
JsonToken t = p.getCurrentToken();

src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,10 +1037,10 @@ protected Object _handleTypedObjectId(JsonParser jp, DeserializationContext ctxt
10371037
* @since 2.3
10381038
*/
10391039
@SuppressWarnings("resource") // TokenBuffers don't need close, nor parser thereof
1040-
protected Object _convertObjectId(JsonParser jp, DeserializationContext ctxt,
1040+
protected Object _convertObjectId(JsonParser p, DeserializationContext ctxt,
10411041
Object rawId, JsonDeserializer<Object> idDeser) throws IOException
10421042
{
1043-
TokenBuffer buf = new TokenBuffer(jp);
1043+
TokenBuffer buf = new TokenBuffer(p, ctxt);
10441044
if (rawId instanceof String) {
10451045
buf.writeString((String) rawId);
10461046
} else if (rawId instanceof Long) {

src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ protected final Object _deserializeUsingPropertyBased(final JsonParser jp,
380380
}
381381
// Ok then, let's collect the whole field; name and value
382382
if (unknown == null) {
383-
unknown = new TokenBuffer(jp);
383+
unknown = new TokenBuffer(jp, ctxt);
384384
}
385385
unknown.writeFieldName(propName);
386386
unknown.copyCurrentStructure(jp);
@@ -458,7 +458,7 @@ protected Object deserializeWithUnwrapped(JsonParser jp, DeserializationContext
458458
if (_propertyBasedCreator != null) {
459459
return deserializeUsingPropertyBasedWithUnwrapped(jp, ctxt);
460460
}
461-
TokenBuffer tokens = new TokenBuffer(jp);
461+
TokenBuffer tokens = new TokenBuffer(jp, ctxt);
462462
tokens.writeStartObject();
463463
Object bean = _valueInstantiator.createUsingDefault(ctxt);
464464

@@ -516,7 +516,7 @@ protected Object deserializeWithUnwrapped(JsonParser jp,
516516
if (t == JsonToken.START_OBJECT) {
517517
t = jp.nextToken();
518518
}
519-
TokenBuffer tokens = new TokenBuffer(jp);
519+
TokenBuffer tokens = new TokenBuffer(jp, ctxt);
520520
tokens.writeStartObject();
521521
final Class<?> activeView = _needViewProcesing ? ctxt.getActiveView() : null;
522522
for (; t == JsonToken.FIELD_NAME; t = jp.nextToken()) {
@@ -560,7 +560,7 @@ protected Object deserializeUsingPropertyBasedWithUnwrapped(JsonParser p,
560560
final PropertyBasedCreator creator = _propertyBasedCreator;
561561
PropertyValueBuffer buffer = creator.startBuilding(p, ctxt, _objectIdReader);
562562

563-
TokenBuffer tokens = new TokenBuffer(p);
563+
TokenBuffer tokens = new TokenBuffer(p, ctxt);
564564
tokens.writeStartObject();
565565

566566
JsonToken t = p.getCurrentToken();

src/main/java/com/fasterxml/jackson/databind/deser/impl/ExternalTypeHandler.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public boolean handleTypePropertyValue(JsonParser jp, DeserializationContext ctx
8888
*
8989
* @return True, if the given property was properly handled
9090
*/
91-
public boolean handlePropertyValue(JsonParser jp, DeserializationContext ctxt,
91+
public boolean handlePropertyValue(JsonParser p, DeserializationContext ctxt,
9292
String propName, Object bean) throws IOException
9393
{
9494
Integer I = _nameToPropertyIndex.get(propName);
@@ -99,13 +99,13 @@ public boolean handlePropertyValue(JsonParser jp, DeserializationContext ctxt,
9999
ExtTypedProperty prop = _properties[index];
100100
boolean canDeserialize;
101101
if (prop.hasTypePropertyName(propName)) {
102-
_typeIds[index] = jp.getText();
103-
jp.skipChildren();
102+
_typeIds[index] = p.getText();
103+
p.skipChildren();
104104
canDeserialize = (bean != null) && (_tokens[index] != null);
105105
} else {
106106
@SuppressWarnings("resource")
107-
TokenBuffer tokens = new TokenBuffer(jp);
108-
tokens.copyCurrentStructure(jp);
107+
TokenBuffer tokens = new TokenBuffer(p, ctxt);
108+
tokens.copyCurrentStructure(p);
109109
_tokens[index] = tokens;
110110
canDeserialize = (bean != null) && (_typeIds[index] != null);
111111
}
@@ -116,7 +116,7 @@ public boolean handlePropertyValue(JsonParser jp, DeserializationContext ctxt,
116116
String typeId = _typeIds[index];
117117
// clear stored data, to avoid deserializing+setting twice:
118118
_typeIds[index] = null;
119-
_deserializeAndSet(jp, ctxt, bean, index, typeId);
119+
_deserializeAndSet(p, ctxt, bean, index, typeId);
120120
_tokens[index] = null;
121121
}
122122
return true;
@@ -228,8 +228,7 @@ protected final Object _deserialize(JsonParser p, DeserializationContext ctxt,
228228
if (t == JsonToken.VALUE_NULL) {
229229
return null;
230230
}
231-
232-
TokenBuffer merged = new TokenBuffer(p);
231+
TokenBuffer merged = new TokenBuffer(p, ctxt);
233232
merged.writeStartArray();
234233
merged.writeString(typeId);
235234
merged.copyCurrentStructure(p2);
@@ -255,7 +254,7 @@ protected final void _deserializeAndSet(JsonParser p, DeserializationContext ctx
255254
_properties[index].getProperty().set(bean, null);
256255
return;
257256
}
258-
TokenBuffer merged = new TokenBuffer(p);
257+
TokenBuffer merged = new TokenBuffer(p, ctxt);
259258
merged.writeStartArray();
260259
merged.writeString(typeId);
261260

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ public class TokenBufferDeserializer extends StdScalarDeserializer<TokenBuffer>
2727
public TokenBufferDeserializer() { super(TokenBuffer.class); }
2828

2929
@Override
30-
public TokenBuffer deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
31-
return createBufferInstance(jp).deserialize(jp, ctxt);
30+
public TokenBuffer deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
31+
return createBufferInstance(p).deserialize(p, ctxt);
3232
}
3333

34-
protected TokenBuffer createBufferInstance(JsonParser jp) {
35-
return new TokenBuffer(jp);
34+
protected TokenBuffer createBufferInstance(JsonParser p) {
35+
return new TokenBuffer(p);
3636
}
3737
}

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,37 +80,37 @@ public Object deserializeTypedFromAny(JsonParser jp, DeserializationContext ctxt
8080
* deserialization.
8181
*/
8282
@SuppressWarnings("resource")
83-
protected Object _deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
83+
protected Object _deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
8484
{
8585
// 02-Aug-2013, tatu: May need to use native type ids
86-
if (jp.canReadTypeId()) {
87-
Object typeId = jp.getTypeId();
86+
if (p.canReadTypeId()) {
87+
Object typeId = p.getTypeId();
8888
if (typeId != null) {
89-
return _deserializeWithNativeTypeId(jp, ctxt, typeId);
89+
return _deserializeWithNativeTypeId(p, ctxt, typeId);
9090
}
9191
}
92-
boolean hadStartArray = jp.isExpectedStartArrayToken();
93-
String typeId = _locateTypeId(jp, ctxt);
92+
boolean hadStartArray = p.isExpectedStartArrayToken();
93+
String typeId = _locateTypeId(p, ctxt);
9494
JsonDeserializer<Object> deser = _findDeserializer(ctxt, typeId);
9595
// Minor complication: we may need to merge type id in?
9696
if (_typeIdVisible
9797
// 06-Oct-2014, tatu: To fix [databind#408], must distinguish between
9898
// internal and external properties
9999
// TODO: but does it need to be injected in external case? Why not?
100100
&& !_usesExternalId()
101-
&& jp.getCurrentToken() == JsonToken.START_OBJECT) {
101+
&& p.getCurrentToken() == JsonToken.START_OBJECT) {
102102
// but what if there's nowhere to add it in? Error? Or skip? For now, skip.
103103
TokenBuffer tb = new TokenBuffer(null, false);
104104
tb.writeStartObject(); // recreate START_OBJECT
105105
tb.writeFieldName(_typePropertyName);
106106
tb.writeString(typeId);
107-
jp = JsonParserSequence.createFlattened(tb.asParser(jp), jp);
108-
jp.nextToken();
107+
p = JsonParserSequence.createFlattened(tb.asParser(p), p);
108+
p.nextToken();
109109
}
110-
Object value = deser.deserialize(jp, ctxt);
110+
Object value = deser.deserialize(p, ctxt);
111111
// And then need the closing END_ARRAY
112-
if (hadStartArray && jp.nextToken() != JsonToken.END_ARRAY) {
113-
throw ctxt.wrongTokenException(jp, JsonToken.END_ARRAY,
112+
if (hadStartArray && p.nextToken() != JsonToken.END_ARRAY) {
113+
throw ctxt.wrongTokenException(p, JsonToken.END_ARRAY,
114114
"expected closing END_ARRAY after type information and deserialized value");
115115
}
116116
return value;

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsPropertyTypeDeserializer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public Object deserializeTypedFromObject(JsonParser jp, DeserializationContext c
9393
return _deserializeTypedForId(jp, ctxt, tb);
9494
}
9595
if (tb == null) {
96-
tb = new TokenBuffer(null, false);
96+
tb = new TokenBuffer(jp, ctxt);
9797
}
9898
tb.writeFieldName(name);
9999
tb.copyCurrentStructure(jp);
@@ -108,7 +108,7 @@ protected Object _deserializeTypedForId(JsonParser jp, DeserializationContext ct
108108
JsonDeserializer<Object> deser = _findDeserializer(ctxt, typeId);
109109
if (_typeIdVisible) { // need to merge id back in JSON input?
110110
if (tb == null) {
111-
tb = new TokenBuffer(null, false);
111+
tb = new TokenBuffer(jp, ctxt);
112112
}
113113
tb.writeFieldName(jp.getCurrentName());
114114
tb.writeString(typeId);

0 commit comments

Comments
 (0)