This is an automated email from the ASF dual-hosted git repository.
rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git
The following commit(s) were added to refs/heads/master by this push:
new 3fd1309 JOHNZON-254 ensure object are deserialized in bigdecimal
3fd1309 is described below
commit 3fd130928f414a1f621eef117b49c7d6df828eac
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Wed Aug 14 11:00:51 2019 +0200
JOHNZON-254 ensure object are deserialized in bigdecimal
---
.../johnzon/jaxrs/ConfigurableJohnzonProvider.java | 4 ++++
.../java/org/apache/johnzon/jsonb/JohnzonBuilder.java | 18 ++++++++++++------
.../java/org/apache/johnzon/mapper/MapperBuilder.java | 8 +++++++-
.../java/org/apache/johnzon/mapper/MapperConfig.java | 9 ++++++++-
.../org/apache/johnzon/mapper/MappingParserImpl.java | 5 +++--
.../org/apache/johnzon/mapper/MapperConfigTest.java | 2 +-
.../src/test/java/org/superbiz/ExtendMappingTest.java | 2 +-
7 files changed, 36 insertions(+), 12 deletions(-)
diff --git
a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
index 9aa9993..3ab6682 100644
---
a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
+++
b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
@@ -110,6 +110,10 @@ public class ConfigurableJohnzonProvider<T> implements
MessageBodyWriter<T>, Mes
builder.setUseJsRange(value);
}
+ public void setUseBigDecimalForObjectNumbers(final boolean value) {
+ builder.setUseBigDecimalForObjectNumbers(value);
+ }
+
// type=a,b,c|type2=d,e
public void setIgnoreFieldsForType(final String mapping) {
for (final String config : mapping.split(" *| *")) {
diff --git
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
index a54281b..431e589 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
@@ -141,6 +141,9 @@ public class JohnzonBuilder implements JsonbBuilder {
config = new JsonbConfig();
}
+ builder.setUseBigDecimalForObjectNumbers(
+
config.getProperty("johnzon.use-big-decimal-for-object").map(this::toBool).orElse(true));
+
final boolean ijson = config.getProperty(JsonbConfig.STRICT_IJSON)
.map(Boolean.class::cast)
.filter(it -> it)
@@ -176,22 +179,22 @@ public class JohnzonBuilder implements JsonbBuilder {
config.getProperty("johnzon.attributeOrder").ifPresent(comp ->
builder.setAttributeOrder(Comparator.class.cast(comp)));
config.getProperty("johnzon.enforceQuoteString")
- .map(v -> !Boolean.class.isInstance(v) ?
Boolean.parseBoolean(v.toString()) : Boolean.class.cast(v))
+ .map(this::toBool)
.ifPresent(builder::setEnforceQuoteString);
config.getProperty("johnzon.primitiveConverters")
- .map(v -> !Boolean.class.isInstance(v) ?
Boolean.parseBoolean(v.toString()) : Boolean.class.cast(v))
+ .map(this::toBool)
.ifPresent(builder::setPrimitiveConverters);
config.getProperty("johnzon.useBigDecimalForFloats")
- .map(v -> !Boolean.class.isInstance(v) ?
Boolean.parseBoolean(v.toString()) : Boolean.class.cast(v))
+ .map(this::toBool)
.ifPresent(builder::setUseBigDecimalForFloats);
config.getProperty("johnzon.deduplicateObjects")
- .map(v -> !Boolean.class.isInstance(v) ?
Boolean.parseBoolean(v.toString()) : Boolean.class.cast(v))
+ .map(this::toBool)
.ifPresent(builder::setDeduplicateObjects);
config.getProperty("johnzon.interfaceImplementationMapping")
.map(Map.class::cast)
.ifPresent(builder::setInterfaceImplementationMapping);
builder.setUseJsRange(config.getProperty("johnzon.use-js-range")
- .map(v -> !Boolean.class.isInstance(v) ?
Boolean.parseBoolean(v.toString()) : Boolean.class.cast(v))
+ .map(this::toBool)
.orElse(true));
final Map<AdapterKey, Adapter<?, ?>> defaultConverters =
createJava8Converters(builder);
@@ -356,7 +359,10 @@ public class JohnzonBuilder implements JsonbBuilder {
}
} : new JohnzonJsonb(mapper, ijson);
}
-
+
+ private Boolean toBool(final Object v) {
+ return !Boolean.class.isInstance(v) ?
Boolean.parseBoolean(v.toString()) : Boolean.class.cast(v);
+ }
private AccessMode toAccessMode(final Object s) {
if (String.class.isInstance(s)) {
diff --git
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
index a13655e..d17468e 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
@@ -144,6 +144,7 @@ public class MapperBuilder {
private boolean useBigDecimalForFloats;
private Boolean deduplicateObjects = null;
private boolean useJsRange;
+ private boolean useBigDecimalForObjectNumbers;
public Mapper build() {
if (readerFactory == null || generatorFactory == null) {
@@ -255,7 +256,7 @@ public class MapperBuilder {
treatByteArrayAsBase64, treatByteArrayAsBase64URL,
readAttributeBeforeWrite,
accessMode, encoding, attributeOrder,
enforceQuoteString, failOnUnknownProperties,
serializeValueFilter, useBigDecimalForFloats,
deduplicateObjects,
- interfaceImplementationMapping, useJsRange),
+ interfaceImplementationMapping, useJsRange,
useBigDecimalForObjectNumbers),
closeables);
}
@@ -522,4 +523,9 @@ public class MapperBuilder {
this.useJsRange = value;
return this;
}
+
+ public MapperBuilder setUseBigDecimalForObjectNumbers(final boolean value)
{
+ this.useBigDecimalForObjectNumbers = value;
+ return this;
+ }
}
diff --git
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
index f13d83f..18184d0 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
@@ -72,6 +72,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig
implements Cloneable {
private final boolean useBigDecimalForFloats;
private final Boolean deduplicateObjects;
private final Map<Class<?>, Class<?>> interfaceImplementationMapping;
+ private final boolean useBigDecimalForObjectNumbers;
private final Map<Class<?>, ObjectConverter.Writer<?>>
objectConverterWriterCache;
private final Map<Class<?>, ObjectConverter.Reader<?>>
objectConverterReaderCache;
@@ -92,7 +93,8 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig
implements Cloneable {
final boolean useBigDecimalForFloats,
final Boolean deduplicateObjects,
final Map<Class<?>, Class<?>>
interfaceImplementationMapping,
- final boolean useJsRange) {
+ final boolean useJsRange,
+ final boolean useBigDecimalForObjectNumbers) {
//CHECKSTYLE:ON
this.objectConverterWriters = objectConverterWriters;
this.objectConverterReaders = objectConverterReaders;
@@ -106,6 +108,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig
implements Cloneable {
this.accessMode = accessMode;
this.encoding = encoding;
this.useJsRange = useJsRange;
+ this.useBigDecimalForObjectNumbers = useBigDecimalForObjectNumbers;
// handle Adapters
this.adapters = adapters;
@@ -125,6 +128,10 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig
implements Cloneable {
this.deduplicateObjects = deduplicateObjects;
}
+ public boolean isUseBigDecimalForObjectNumbers() {
+ return useBigDecimalForObjectNumbers;
+ }
+
public boolean isUseJsRange() {
return useJsRange;
}
diff --git
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
index 83005b0..76b5329 100644
---
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
+++
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
@@ -273,7 +273,7 @@ public class MappingParserImpl implements MappingParser {
} else if (EnumMap.class.isAssignableFrom(raw)) {
map = new EnumMap(Class.class.cast(fieldArgTypes[0]));
} else if (Map.class.isAssignableFrom(raw)) {
- map = new HashMap(object.size());
+ map = new LinkedHashMap(object.size()); // todo:
configurable from config.getNewDefaultMap()?
} else {
map = null;
}
@@ -291,7 +291,8 @@ public class MappingParserImpl implements MappingParser {
for (final Map.Entry<String, JsonValue> value :
object.entrySet()) {
final JsonValue jsonValue = value.getValue();
if (JsonNumber.class.isInstance(jsonValue) && any)
{
- map.put(value.getKey(),
toNumberValue(JsonNumber.class.cast(jsonValue)));
+ map.put(value.getKey(),
config.isUseBigDecimalForObjectNumbers() ?
+
JsonNumber.class.cast(jsonValue).bigDecimalValue() :
toNumberValue(JsonNumber.class.cast(jsonValue)));
} else if (JsonString.class.isInstance(jsonValue)
&& any) {
map.put(value.getKey(),
JsonString.class.cast(jsonValue).getString());
} else {
diff --git
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
index 5cb7e57..e770b7d 100644
---
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
+++
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
@@ -169,7 +169,7 @@ public class MapperConfigTest {
new FieldAccessMode(true, true),
Charset.forName("UTF-8"),
null,
- false, false, null, false, false, emptyMap(),
true);
+ false, false, null, false, false, emptyMap(),
true, false);
}
diff --git a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
index 7ecf5a4..bbfdc31 100644
--- a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
+++ b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java
@@ -66,7 +66,7 @@ public class ExtendMappingTest {
-1, true, true, true, false, false, false,
new FieldAccessMode(false, false),
Charset.forName("UTF-8"), String::compareTo, false, false,
null, false, false,
- emptyMap(), true));
+ emptyMap(), true, false));
}
@Override