Repository: johnzon Updated Branches: refs/heads/master dc2cd8f7a -> a25adfaee
JOHNZON-154 ensure we support Object as being dynamically evaluated Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/a25adfae Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/a25adfae Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/a25adfae Branch: refs/heads/master Commit: a25adfaee4dfe30ceea0bdaafba6e3978e749923 Parents: dc2cd8f Author: Romain Manni-Bucau <rmannibu...@gmail.com> Authored: Wed Jan 24 15:05:42 2018 +0100 Committer: Romain Manni-Bucau <rmannibu...@gmail.com> Committed: Wed Jan 24 15:05:42 2018 +0100 ---------------------------------------------------------------------- .../johnzon/jsonb/ObjectSerializationTest.java | 77 ++++++++++++++++++++ .../johnzon/mapper/MappingGeneratorImpl.java | 29 +++----- .../org/apache/johnzon/mapper/Mappings.java | 10 ++- .../johnzon/mapper/ObjectSerializationTest.java | 74 +++++++++++++++++++ 4 files changed, 168 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/a25adfae/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/ObjectSerializationTest.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/ObjectSerializationTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/ObjectSerializationTest.java new file mode 100644 index 0000000..7ad703c --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/ObjectSerializationTest.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.johnzon.jsonb; + +import static java.util.Arrays.asList; +import static org.junit.Assert.assertEquals; + +import javax.json.bind.Jsonb; +import javax.json.bind.JsonbBuilder; + +import org.junit.Test; + +public class ObjectSerializationTest { + private final Jsonb mapper = JsonbBuilder.create(); + + @Test + public void primitiveBoolean() { + assertEquals("{\"data\":true}", toJson(new Wrapper(true))); + } + + @Test + public void numberBoolean() { + assertEquals("{\"data\":1}", toJson(new Wrapper(1))); + } + + @Test + public void stringBoolean() { + assertEquals("{\"data\":\"ok\"}", toJson(new Wrapper("ok"))); + } + + @Test + public void objectBoolean() { + assertEquals("{\"data\":{\"data\":\"ok\"}}", toJson(new Wrapper(new Wrapper("ok")))); + } + + @Test + public void arrayString() { + assertEquals("{\"data\":[\"10\",\"2\"]}", toJson(new Wrapper(asList("10", "2")))); + } + + @Test + public void nestedArrayString() { + assertEquals("{\"data\":{\"data\":[\"10\",\"2\"]}}", toJson(new Wrapper(new Wrapper(asList("10", "2"))))); + } + + private String toJson(final Wrapper wrapper) { + return mapper.toJson(wrapper); + } + + public static class Wrapper { + private final Object data; + + private Wrapper(final Object data) { + this.data = data; + } + + public Object getData() { + return data; + } + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/a25adfae/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java index b952a57..773e615 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java @@ -136,13 +136,8 @@ public class MappingGeneratorImpl implements MappingGenerator { } final Class<?> valueClass = value.getClass(); - final boolean primitive = Mappings.isPrimitive(valueClass); - final boolean clazz = mappings.getClassMapping(valueClass) != null; - final boolean array = clazz || primitive ? false : valueClass.isArray(); - final boolean collection = clazz || primitive || array ? false : Collection.class.isAssignableFrom(valueClass); - final boolean map = clazz || primitive || array || collection ? false : Map.class.isAssignableFrom(valueClass); - writeValue(valueClass, - primitive, array, collection, map, itemConverter, + writeValue(valueClass, true, + false, false, false, false, itemConverter, key == null ? "null" : key.toString(), value, null, null, null); } return generator; @@ -289,6 +284,7 @@ public class MappingGeneratorImpl implements MappingGenerator { generator.write(getterEntry.getKey(), valJsonPointer); } else { writeValue(val.getClass(), + getter.dynamic, getter.primitive, getter.array, getter.collection, @@ -312,8 +308,8 @@ public class MappingGeneratorImpl implements MappingGenerator { } } - - private void writeValue(final Class<?> type, + //CHECKSTYLE:OFF + private void writeValue(final Class<?> type, final boolean dynamic, final boolean primitive, final boolean array, final boolean collection, final boolean map, final Adapter itemConverter, @@ -322,10 +318,11 @@ public class MappingGeneratorImpl implements MappingGenerator { final Collection<String> ignoredProperties, final JsonPointerTracker jsonPointer) throws InvocationTargetException, IllegalAccessException { + //CHECKSTYLE:ON if (config.getSerializeValueFilter().shouldIgnore(key, value)) { return; } - if (array) { + if (array || (dynamic && type.isArray())) { final int length = Array.getLength(value); if (length == 0 && config.isSkipEmptyArray()) { return; @@ -352,8 +349,7 @@ public class MappingGeneratorImpl implements MappingGenerator { } } generator.writeEnd(); - return; - } else if (collection) { + } else if (collection || (dynamic && Collection.class.isAssignableFrom(type))) { generator.writeStartArray(key); int i = 0; for (final Object o : Collection.class.cast(value)) { @@ -379,15 +375,12 @@ public class MappingGeneratorImpl implements MappingGenerator { i++; } generator.writeEnd(); - return; - } else if (map) { + } else if (map || (dynamic && Map.class.isAssignableFrom(type))) { generator.writeStartObject(key); writeMapBody((Map<?, ?>) value, itemConverter); generator.writeEnd(); - return; - } else if (primitive) { + } else if (primitive || (dynamic && Mappings.isPrimitive(type))) { writePrimitives(key, type, value); - return; } else { final Adapter converter = config.findAdapter(type); if (converter != null) { @@ -395,7 +388,7 @@ public class MappingGeneratorImpl implements MappingGenerator { if (writePrimitives(key, adapted.getClass(), adapted)) { return; } - writeValue(String.class, true, false, false, false, null, key, adapted, null, ignoredProperties, jsonPointer); + writeValue(String.class, true, true, false, false, false, null, key, adapted, null, ignoredProperties, jsonPointer); return; } else { ObjectConverter.Writer objectConverterToUse = objectConverter; http://git-wip-us.apache.org/repos/asf/johnzon/blob/a25adfae/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java index c8d63fe..44e13f1 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java @@ -115,13 +115,14 @@ public class Mappings { public final Adapter converter; public final Adapter itemConverter; public final ObjectConverter.Writer objectConverter; + public final boolean dynamic; public final boolean primitive; public final boolean array; public final boolean map; public final boolean collection; public final Collection<String> ignoreNested; - public Getter(final AccessMode.Reader reader, + public Getter(final AccessMode.Reader reader, final boolean dynamic, final boolean primitive, final boolean array, final boolean collection, final boolean map, final MapperConverter converter, @@ -129,6 +130,7 @@ public class Mappings { final int version, final String[] ignoreNested) { this.reader = reader; this.version = version; + this.dynamic = dynamic; this.array = array; this.collection = collection; this.primitive = primitive; @@ -404,7 +406,7 @@ public class Mappings { accessMode.findWriter(clazz), anyGetter != null ? new Getter( new MethodAccessMode.MethodReader(anyGetter, anyGetter.getReturnType()), - false, false, false, true, null, null, -1, null) : null, + false,false, false, false, true, null, null, -1, null) : null, accessMode.findAnySetter(clazz)); accessMode.afterParsed(clazz); @@ -458,7 +460,7 @@ public class Mappings { if (readIgnore == null || readIgnore.minVersion() >= 0) { final Class<?> returnType = Class.class.isInstance(value.getType()) ? Class.class.cast(value.getType()) : null; final ParameterizedType pt = ParameterizedType.class.isInstance(value.getType()) ? ParameterizedType.class.cast(value.getType()) : null; - final Getter getter = new Getter(value, isPrimitive(returnType), + final Getter getter = new Getter(value, returnType == Object.class, isPrimitive(returnType), returnType != null && returnType.isArray(), (pt != null && Collection.class.isAssignableFrom(Class.class.cast(pt.getRawType()))) || (returnType != null && Collection.class.isAssignableFrom(returnType)), @@ -514,7 +516,7 @@ public class Mappings { final Getter getter = getters.get(key); final MapBuilderReader newReader = new MapBuilderReader(objectGetters, path, config.getVersion()); getters.put(key, new Getter(getter == null ? newReader : - new CompositeReader(getter.reader, newReader), false, false, false, true, null, null, -1, null)); + new CompositeReader(getter.reader, newReader), false, false, false, false, true, null, null, -1, null)); final Setter newSetter = setters.get(key); final MapUnwrapperWriter newWriter = new MapUnwrapperWriter(objectSetters, path); http://git-wip-us.apache.org/repos/asf/johnzon/blob/a25adfae/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java new file mode 100644 index 0000000..b6bb10d --- /dev/null +++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.johnzon.mapper; + +import static java.util.Arrays.asList; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class ObjectSerializationTest { + private final Mapper mapper = new MapperBuilder().build(); + + @Test + public void primitiveBoolean() { + assertEquals("{\"data\":true}", toJson(new Wrapper(true))); + } + + @Test + public void numberBoolean() { + assertEquals("{\"data\":1}", toJson(new Wrapper(1))); + } + + @Test + public void stringBoolean() { + assertEquals("{\"data\":\"ok\"}", toJson(new Wrapper("ok"))); + } + + @Test + public void objectBoolean() { + assertEquals("{\"data\":{\"data\":\"ok\"}}", toJson(new Wrapper(new Wrapper("ok")))); + } + + @Test + public void arrayString() { + assertEquals("{\"data\":[\"10\",\"2\"]}", toJson(new Wrapper(asList("10", "2")))); + } + + @Test + public void nestedArrayString() { + assertEquals("{\"data\":{\"data\":[\"10\",\"2\"]}}", toJson(new Wrapper(new Wrapper(asList("10", "2"))))); + } + + private String toJson(final Wrapper wrapper) { + return mapper.writeObjectAsString(wrapper); + } + + public static class Wrapper { + private final Object data; + + private Wrapper(final Object data) { + this.data = data; + } + + public Object getData() { + return data; + } + } +}