Repository: johnzon Updated Branches: refs/heads/master 12b25ba79 -> 0a45f1968
JOHNZON-117 patch from Kimmel Tamas to enhance our number handling in generic structures (map etc), thanks a lot Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/0a45f196 Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/0a45f196 Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/0a45f196 Branch: refs/heads/master Commit: 0a45f19686ef2da774a1a939526942ea71c4dff6 Parents: 12b25ba Author: rmannibucau <[email protected]> Authored: Tue May 30 10:34:07 2017 +0200 Committer: rmannibucau <[email protected]> Committed: Tue May 30 10:34:07 2017 +0200 ---------------------------------------------------------------------- .../jaxrs/ConfigurableJohnzonProvider.java | 4 +++ .../WildcardConfigurableJohnzonProvider.java | 4 +++ .../apache/johnzon/jsonb/JohnzonBuilder.java | 3 ++ .../johnzon/jsonb/DefaultMappingTest.java | 6 ++-- .../apache/johnzon/mapper/MapperBuilder.java | 8 ++++- .../org/apache/johnzon/mapper/MapperConfig.java | 8 ++++- .../johnzon/mapper/MappingParserImpl.java | 38 ++++++++++---------- .../org/apache/johnzon/mapper/LiteralTest.java | 10 ++++++ .../apache/johnzon/mapper/MapperConfigTest.java | 2 +- .../java/org/superbiz/ExtendMappingTest.java | 2 +- 10 files changed, 60 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java ---------------------------------------------------------------------- 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 f59d48e..160ee21 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 @@ -224,4 +224,8 @@ public class ConfigurableJohnzonProvider<T> implements MessageBodyWriter<T>, Mes throw new IllegalArgumentException(e.getCause()); } } + + public void setUseBigDecimalForFloats(final boolean useBigDecimalForFloats) { + builder.setUseBigDecimalForFloats(useBigDecimalForFloats); + } } http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java ---------------------------------------------------------------------- diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java index 2ca7e12..445d810 100644 --- a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java +++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WildcardConfigurableJohnzonProvider.java @@ -219,4 +219,8 @@ public class WildcardConfigurableJohnzonProvider<T> implements MessageBodyWriter public void setPrimitiveConverters(final boolean val) { builder.setPrimitiveConverters(val); } + + public void setUseBigDecimalForFloats(final boolean useBigDecimalForFloats) { + builder.setUseBigDecimalForFloats(useBigDecimalForFloats); + } } http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java ---------------------------------------------------------------------- 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 36c21b6..e2b2708 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 @@ -210,6 +210,9 @@ public class JohnzonBuilder implements JsonbBuilder { config.getProperty("johnzon.primitiveConverters") .map(v -> !Boolean.class.isInstance(v) ? Boolean.parseBoolean(v.toString()) : Boolean.class.cast(v)) .ifPresent(builder::setPrimitiveConverters); + config.getProperty("johnzon.useBigDecimalForFloats") + .map(v -> !Boolean.class.isInstance(v) ? Boolean.parseBoolean(v.toString()) : Boolean.class.cast(v)) + .ifPresent(builder::setUseBigDecimalForFloats); final Map<AdapterKey, Adapter<?, ?>> defaultConverters = createJava8Converters(builder); http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java index 5c99371..d638d5a 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/DefaultMappingTest.java @@ -340,11 +340,11 @@ public class DefaultMappingTest { //Map Map<String, Object> map = (Map<String, Object>) JSONB.fromJson("{\"name\":\"unknown object\"}", Object.class); - //mapping for number -> Integer, Long, BigDecimal - Map<String, Object> mapWithBigDecimal = (Map<String, Object>) JSONB.fromJson("{\"intValue\":5,\"longValue\":17179869184,\"otherValue\":1.2}", Object.class); + //mapping for number -> Integer, Long, Double + Map<String, Object> mapWithBigDecimal = (Map<String, Object>) JSONB.fromJson("{\"intValue\":5,\"longValue\":17179869184,\"doubleValue\":1.2}", Object.class); assertTrue(mapWithBigDecimal.get("intValue") instanceof Integer); assertTrue(mapWithBigDecimal.get("longValue") instanceof Long); - assertTrue(mapWithBigDecimal.get("otherValue") instanceof BigDecimal); + assertTrue(mapWithBigDecimal.get("doubleValue") instanceof Double); //Collection /* why collection and not array or sthg else? http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java ---------------------------------------------------------------------- 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 059bf1e..ca0244f 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 @@ -131,6 +131,7 @@ public class MapperBuilder { private boolean primitiveConverters; private boolean failOnUnknownProperties; private SerializeValueFilter serializeValueFilter; + private boolean useBigDecimalForFloats; public Mapper build() { if (readerFactory == null || generatorFactory == null) { @@ -218,7 +219,7 @@ public class MapperBuilder { skipNull, skipEmptyArray, treatByteArrayAsBase64, treatByteArrayAsBase64URL, readAttributeBeforeWrite, accessMode, encoding, attributeOrder, enforceQuoteString, failOnUnknownProperties, - serializeValueFilter), + serializeValueFilter, useBigDecimalForFloats), closeables); } @@ -402,4 +403,9 @@ public class MapperBuilder { this.serializeValueFilter = serializeValueFilter; return this; } + + public MapperBuilder setUseBigDecimalForFloats(final boolean useBigDecimalForFloats) { + this.useBigDecimalForFloats = useBigDecimalForFloats; + return this; + } } http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java ---------------------------------------------------------------------- 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 cbd3437..5e9ccea 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 @@ -65,6 +65,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable { private final boolean enforceQuoteString; private final boolean failOnUnknown; private final SerializeValueFilter serializeValueFilter; + private final boolean useBigDecimalForFloats; private final Map<Class<?>, ObjectConverter.Writer<?>> objectConverterWriterCache; private final Map<Class<?>, ObjectConverter.Reader<?>> objectConverterReaderCache; @@ -81,7 +82,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable { final AccessMode accessMode, final Charset encoding, final Comparator<String> attributeOrder, final boolean enforceQuoteString, final boolean failOnUnknown, - final SerializeValueFilter serializeValueFilter) { + final SerializeValueFilter serializeValueFilter, boolean useBigDecimalForFloats) { //CHECKSTYLE:ON this.objectConverterWriters = objectConverterWriters; this.objectConverterReaders = objectConverterReaders; @@ -102,6 +103,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable { this.objectConverterWriterCache = new HashMap<Class<?>, ObjectConverter.Writer<?>>(objectConverterWriters.size()); this.objectConverterReaderCache = new HashMap<Class<?>, ObjectConverter.Reader<?>>(objectConverterReaders.size()); + this.useBigDecimalForFloats = useBigDecimalForFloats; } public SerializeValueFilter getSerializeValueFilter() { @@ -294,4 +296,8 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable { public boolean isEnforceQuoteString() { return enforceQuoteString; } + + public boolean isUseBigDecimalForFloats() { + return useBigDecimalForFloats; + } } http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java ---------------------------------------------------------------------- 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 4810f9d..a97427f 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 @@ -18,7 +18,6 @@ */ package org.apache.johnzon.mapper; -import org.apache.johnzon.core.JsonLongImpl; import org.apache.johnzon.mapper.access.AccessMode; import org.apache.johnzon.mapper.converter.CharacterConverter; import org.apache.johnzon.mapper.converter.EnumConverter; @@ -247,18 +246,7 @@ 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) { - final JsonNumber number = JsonNumber.class.cast(jsonValue); - if (JsonLongImpl.class.isInstance(number)) { - final int integer = number.intValue(); - final long asLong = number.longValue(); - if (integer == asLong) { - map.put(value.getKey(), integer); - } else { - map.put(value.getKey(), asLong); - } - } else { - map.put(value.getKey(), !number.isIntegral() ? number.bigDecimalValue() : number.intValue()); - } + map.put(value.getKey(), toNumberValue(JsonNumber.class.cast(jsonValue))); } else if (JsonString.class.isInstance(jsonValue) && any) { map.put(value.getKey(), JsonString.class.cast(jsonValue).getString()); } else { @@ -353,6 +341,24 @@ public class MappingParserImpl implements MappingParser { return t; } + private Number toNumberValue(JsonNumber jsonNumber) { + if (jsonNumber.isIntegral()) { + final int intValue = jsonNumber.intValue(); + final long longValue = jsonNumber.longValue(); + if (intValue == longValue) { + return intValue; + } else { + return longValue; + } + } else { + if (config.isUseBigDecimalForFloats()) { + return jsonNumber.bigDecimalValue(); + } else { + return jsonNumber.doubleValue(); + } + } + } + private Object convertTo(final Adapter converter, final JsonValue jsonValue) { if (jsonValue.getValueType() == JsonValue.ValueType.OBJECT) { @@ -462,11 +468,7 @@ public class MappingParserImpl implements MappingParser { return false; } if (JsonNumber.class.isInstance(jsonValue)) { - final JsonNumber jsonNumber = JsonNumber.class.cast(jsonValue); - if (jsonNumber.isIntegral()) { - return jsonNumber.intValue(); - } - return jsonNumber.doubleValue(); + return toNumberValue(JsonNumber.class.cast(jsonValue)); } } http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java index dc74f24..830779e 100644 --- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java @@ -85,6 +85,16 @@ public class LiteralTest { } + @Test + public void readWhenUseBigDecimalForFloats() throws Exception { + final String json = "[1.5]"; + final List<Object> expected = new ArrayList<Object>(); + expected.add(new BigDecimal(1.5d)); + final Collection<Object> read = new MapperBuilder().setUseBigDecimalForFloats(true).build() + .readCollection(new StringReader(json), new JohnzonParameterizedType(List.class, Object.class)); + assertEquals(expected, read); + } + @Test(expected = NumberFormatException.class) public void writeReadNumbersInf() { final NumberClass nc = new NumberClass(); http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java ---------------------------------------------------------------------- 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 949b230..a84a1cd 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 @@ -166,7 +166,7 @@ public class MapperConfigTest { new FieldAccessMode(true, true), Charset.forName("UTF-8"), null, - false, false, null); + false, false, null, false); } http://git-wip-us.apache.org/repos/asf/johnzon/blob/0a45f196/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java index 1960d4e..6c0c3de 100644 --- a/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java +++ b/johnzon-mapper/src/test/java/org/superbiz/ExtendMappingTest.java @@ -71,7 +71,7 @@ public class ExtendMappingTest { public int compare(final String o1, final String o2) { return o1.compareTo(o2); } - }, false, false, null)); + }, false, false, null, false)); } @Override
