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 2016/06/03 09:31:32 UTC
incubator-johnzon git commit: JOHNZON-81 better support of Object as
mapping type
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 <rm...@gmail.com>
Authored: Fri Jun 3 11:31:18 2016 +0200
Committer: Romain manni-Bucau <rm...@gmail.com>
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"));