You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2019/08/14 09:00:57 UTC
[johnzon] branch master updated: JOHNZON-254 ensure object are
deserialized in bigdecimal
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 <rm...@apache.org>
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