Skip to content

Commit 961480c

Browse files
authored
Fix: Use Big Decimal for Tree (#135)
1 parent 4a2e934 commit 961480c

File tree

6 files changed

+74
-33
lines changed

6 files changed

+74
-33
lines changed

jr-stree/src/main/java/com/fasterxml/jackson/jr/stree/JacksonJrsTreeCodec.java

+15-3
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,16 @@
1313
*/
1414
public class JacksonJrsTreeCodec extends TreeCodec
1515
{
16-
public static JrsMissing MISSING = JrsMissing.instance;
16+
public static final JrsMissing MISSING = JrsMissing.instance;
17+
1718
protected final ObjectCodec _objectCodec;
1819

1920
// @since 2.17
2021
protected boolean _failOnDuplicateKeys;
21-
22+
23+
// @since 2.17.1
24+
protected boolean _useBigDecimalForDouble;
25+
2226
public JacksonJrsTreeCodec() {
2327
this(null);
2428
}
@@ -31,7 +35,12 @@ public JacksonJrsTreeCodec(ObjectCodec codec) {
3135
public void setFailOnDuplicateKeys(boolean state) {
3236
_failOnDuplicateKeys = state;
3337
}
34-
38+
39+
// @since 2.17.1
40+
public void setUseBigDecimalForDouble(boolean state) {
41+
_useBigDecimalForDouble = state;
42+
}
43+
3544
@SuppressWarnings("unchecked")
3645
@Override
3746
public <T extends TreeNode> T readTree(JsonParser p) throws IOException {
@@ -50,6 +59,9 @@ private JrsValue nodeFrom(JsonParser p) throws IOException
5059
return JrsBoolean.FALSE;
5160
case JsonTokenId.ID_NUMBER_INT:
5261
case JsonTokenId.ID_NUMBER_FLOAT:
62+
if (_useBigDecimalForDouble) {
63+
return new JrsNumber(p.getDecimalValue());
64+
}
5365
return new JrsNumber(p.getNumberValue());
5466
case JsonTokenId.ID_STRING:
5567
return new JrsString(p.getText());

jr-stree/src/main/java/com/fasterxml/jackson/jr/stree/JrSimpleTreeExtension.java

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public JrSimpleTreeExtension(JacksonJrsTreeCodec tc) {
2828
@Override
2929
protected void register(ExtensionContext ctxt) {
3030
_codec.setFailOnDuplicateKeys(ctxt.isEnabled(JSON.Feature.FAIL_ON_DUPLICATE_MAP_KEYS));
31+
_codec.setUseBigDecimalForDouble(ctxt.isEnabled(JSON.Feature.USE_BIG_DECIMAL_FOR_FLOATS));
3132
ctxt.setTreeCodec(_codec);
3233
}
3334
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.fasterxml.jackson.jr.stree;
2+
3+
import com.fasterxml.jackson.core.TreeNode;
4+
import com.fasterxml.jackson.jr.ob.JSON;
5+
6+
import java.math.BigDecimal;
7+
8+
// [jackson-jr#90]: JSON.Feature.USE_BIG_DECIMAL_FOR_FLOATS should work
9+
public class ReadAsBigDecimal90Test extends JacksonJrTreeTestBase
10+
{
11+
// [jackson-jr#90]
12+
public void testDefaultBehaviourReadAsDouble() throws Exception
13+
{
14+
JSON json = JSON.builder()
15+
.disable(JSON.Feature.USE_BIG_DECIMAL_FOR_FLOATS)
16+
.register(new JrSimpleTreeExtension())
17+
.build();
18+
19+
String input = "[1.1]";
20+
21+
TreeNode node = json.treeFrom(input);
22+
TreeNode elemNode = node.get(0);
23+
24+
assertTrue(elemNode.isValueNode());
25+
assertTrue(elemNode instanceof JrsNumber);
26+
assertEquals(Double.class,
27+
((JrsNumber) elemNode).getValue().getClass());
28+
}
29+
30+
// [jackson-jr#90]
31+
public void testReadAsBigDecimal() throws Exception
32+
{
33+
JSON json = JSON.builder()
34+
.enable(JSON.Feature.USE_BIG_DECIMAL_FOR_FLOATS)
35+
.register(new JrSimpleTreeExtension())
36+
.build();
37+
38+
String input = "[1.1]";
39+
40+
TreeNode node = json.treeFrom(input);
41+
TreeNode elemNode = node.get(0);
42+
43+
assertTrue(elemNode.isValueNode());
44+
assertTrue(elemNode instanceof JrsNumber);
45+
assertEquals(BigDecimal.class,
46+
((JrsNumber) elemNode).getValue().getClass());
47+
}
48+
}

jr-stree/src/test/java/com/fasterxml/jackson/jr/stree/failing/ReadAsBigDecimal90Test.java

-30
This file was deleted.

release-notes/CREDITS-2.x

+4
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,7 @@ Julian Honnen (@jhonnen)
6161
(2.17.0)
6262
* Contributed impl for #100: Add support for `java.time` (Java 8 date/time) types
6363
(2.17.0)
64+
* Contributed fix for #90: `USE_BIG_DECIMAL_FOR_FLOATS` feature not working
65+
when using `JSON.treeFrom()`
66+
(2.17.1)
67+

release-notes/VERSION-2.x

+6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ Modules:
1111
=== Releases ===
1212
------------------------------------------------------------------------
1313

14+
2.17.1 (not yet released)
15+
16+
#90: `USE_BIG_DECIMAL_FOR_FLOATS` feature not working when using `JSON.treeFrom()`
17+
(reported by @jvdsandt)
18+
(fix contributed by @Shounaks)
19+
1420
2.17.0 (12-Mar-2024)
1521

1622
#7: Support deserialization of `int[]`

0 commit comments

Comments
 (0)