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