Repository: incubator-johnzon Updated Branches: refs/heads/master f65387945 -> 95f0c4662
JOHNZON-81 better support of Object as mapping type Project: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/commit/95f0c466 Tree: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/tree/95f0c466 Diff: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/diff/95f0c466 Branch: refs/heads/master Commit: 95f0c466252b3f94d9e33b263a95e797734150d3 Parents: f653879 Author: Romain manni-Bucau <[email protected]> Authored: Fri Jun 3 11:31:18 2016 +0200 Committer: Romain manni-Bucau <[email protected]> Committed: Fri Jun 3 11:31:18 2016 +0200 ---------------------------------------------------------------------- .../java/org/apache/johnzon/mapper/Mapper.java | 13 +++++---- .../johnzon/mapper/MappingParserImpl.java | 14 +++++---- .../org/apache/johnzon/mapper/MapperTest.java | 30 ++++++++++++++++++++ 3 files changed, 47 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/95f0c466/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java index c8a163e..5935c36 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java @@ -39,6 +39,7 @@ import java.io.Writer; import java.lang.reflect.Array; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collection; import java.util.concurrent.ConcurrentHashMap; @@ -56,6 +57,7 @@ public class Mapper implements Closeable { protected final ConcurrentMap<Adapter<?, ?>, AdapterKey> reverseAdaptersRegistry = new ConcurrentHashMap<Adapter<?, ?>, AdapterKey>(); protected final ReaderHandler readerHandler; protected final Collection<Closeable> closeables; + protected final Charset charset; Mapper(final JsonReaderFactory readerFactory, final JsonGeneratorFactory generatorFactory, MapperConfig config, final Collection<Closeable> closeables) { @@ -65,6 +67,7 @@ public class Mapper implements Closeable { this.mappings = new Mappings(config); this.readerHandler = ReaderHandler.create(readerFactory); this.closeables = closeables; + this.charset = config.getEncoding() == null ? null : config.getEncoding(); } @@ -131,7 +134,7 @@ public class Mapper implements Closeable { writeObject(object, generator); } - private void writeObject(Object object, JsonGenerator generator) { + private void writeObject(final Object object, final JsonGenerator generator) { MappingGeneratorImpl mappingGenerator = new MappingGeneratorImpl(config, generator, mappings); RuntimeException originalException = null; @@ -183,11 +186,11 @@ public class Mapper implements Closeable { } public <T> T readObject(final InputStream stream, final Type clazz) { - return mapObject(clazz, readerFactory.createReader(stream(stream))); + return mapObject(clazz, charset == null ? readerFactory.createReader(stream(stream)): readerFactory.createReader(stream(stream), charset)); } public <T> Collection<T> readCollection(final InputStream stream, final ParameterizedType genericType) { - return mapObject(genericType, readerFactory.createReader(stream(stream))); + return mapObject(genericType, charset == null ? readerFactory.createReader(stream(stream)): readerFactory.createReader(stream(stream), charset)); } public <T> T readJohnzonCollection(final InputStream stream, final JohnzonCollectionType<T> genericType) { @@ -208,7 +211,7 @@ public class Mapper implements Closeable { } public <T> T readTypedArray(final InputStream stream, final Class<?> elementType, final Class<T> arrayType) { - final JsonReader reader = readerFactory.createReader(stream(stream)); + final JsonReader reader = charset == null ? readerFactory.createReader(stream(stream)): readerFactory.createReader(stream(stream), charset); return arrayType.cast(mapArray(elementType, reader)); } @@ -218,7 +221,7 @@ public class Mapper implements Closeable { } public <T> T[] readArray(final InputStream stream, final Class<T> clazz) { - final JsonReader reader = readerFactory.createReader(stream(stream)); + final JsonReader reader = charset == null ? readerFactory.createReader(stream(stream)): readerFactory.createReader(stream(stream), charset); return (T[]) mapArray(clazz, reader); } http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/95f0c466/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 ae1eea6..8640863 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 @@ -64,6 +64,8 @@ import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import static java.util.Arrays.asList; + /** * This class is not concurrently usable as it contains state. */ @@ -121,7 +123,7 @@ public class MappingParserImpl implements MappingParser { if (JsonObject.class.isInstance(jsonValue)) { return (T) buildObject(targetType, JsonObject.class.cast(jsonValue), applyObjectConverter); } - if (JsonString.class.isInstance(jsonValue) && targetType == String.class) { + if (JsonString.class.isInstance(jsonValue) && (targetType == String.class || targetType == Object.class)) { return (T) JsonString.class.cast(jsonValue).getString(); } if (JsonNumber.class.isInstance(jsonValue)) { @@ -132,7 +134,7 @@ public class MappingParserImpl implements MappingParser { if (targetType == long.class || targetType == Long.class) { return (T) Long.valueOf(number.longValue()); } - if (targetType == double.class || targetType == Double.class) { + if (targetType == double.class || targetType == Double.class || targetType == Object.class) { return (T) Double.valueOf(number.doubleValue()); } if (targetType == BigDecimal.class) { @@ -157,16 +159,18 @@ public class MappingParserImpl implements MappingParser { } return (T) mapCollection(mapping, jsonArray, null); - + } + if (Object.class == targetType) { + return (T) new ArrayList(asList(Object[].class.cast(buildArrayWithComponentType(jsonArray, Object.class, null)))); } } if (JsonValue.NULL == jsonValue) { return null; } - if (JsonValue.TRUE == jsonValue && (Boolean.class == targetType || boolean.class == targetType)) { + if (JsonValue.TRUE == jsonValue && (Boolean.class == targetType || boolean.class == targetType || Object.class == targetType)) { return (T) Boolean.TRUE; } - if (JsonValue.FALSE == jsonValue && (Boolean.class == targetType || boolean.class == targetType)) { + if (JsonValue.FALSE == jsonValue && (Boolean.class == targetType || boolean.class == targetType || Object.class == targetType)) { return (T) Boolean.FALSE; } throw new IllegalArgumentException("Unsupported " + jsonValue + " for type " + targetType); http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/95f0c466/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java index 8b3d25d..8da2388 100644 --- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java @@ -33,6 +33,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -157,6 +158,35 @@ public class MapperTest { assertOneDimension(k, 5); } + @Test + public void readMapWithJustObject() { + { // object + final Object raw = new MapperBuilder().build() + .readObject(new ByteArrayInputStream(("{\"a\":1,\"b\":true,\"c\":null,\"d\":[1, 2], " + + "\"e\":[\"i\", \"j\"],\"k\":{\"a\":1,\"b\":true,\"c\":null,\"d\":[1, 2], \"e\":[\"i\", \"j\"]}}").getBytes()), + Object.class); + final Map<String, Object> data = Map.class.cast(raw); + assertOneDimension(data, 6); + + final Map<String, Object> k = (Map<String, Object>) data.get("k"); + assertNotNull(k); + assertOneDimension(k, 5); + } + { // primitives + assertEquals(Boolean.TRUE, new MapperBuilder().build().readObject(new ByteArrayInputStream("true".getBytes()), Object.class)); + assertEquals(Boolean.FALSE, new MapperBuilder().build().readObject(new ByteArrayInputStream("false".getBytes()), Object.class)); + assertEquals(1., new MapperBuilder().setEncoding("UTF-8" /*otherwise guess algo fails, too small string*/).build() + .readObject(new ByteArrayInputStream("1".getBytes()), Object.class)); + assertEquals("val", new MapperBuilder().build().readObject(new ByteArrayInputStream("\"val\"".getBytes()), Object.class)); + assertEquals(asList("val1", "val2"), new MapperBuilder().build().readObject(new ByteArrayInputStream("[\"val1\", \"val2\"]".getBytes()), Object.class)); + assertEquals(new HashMap<String, Object>() {{ + put("a", "val"); + put("b", true); + put("c", 1); + }}, new MapperBuilder().build().readObject(new ByteArrayInputStream("{\"a\":\"val\", \"b\": true, \"c\": 1}".getBytes()), Object.class)); + } + } + private void assertOneDimension(final Map<String, Object> data, final int size) { assertEquals(size, data.size()); assertEquals(1, data.get("a"));
