Repository: johnzon Updated Branches: refs/heads/master 389dfe1fc -> ed2a42ef1
JOHNZON-99 JOHNZON-100 improve JSON-B private attribute support * evaluate the JsonVisibility * honor @JsonProperty fields Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/a89915df Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/a89915df Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/a89915df Branch: refs/heads/master Commit: a89915df65a31523413c93cc946a79b38ae3db55 Parents: 389dfe1 Author: Mark Struberg <[email protected]> Authored: Mon Dec 5 21:32:36 2016 +0100 Committer: Mark Struberg <[email protected]> Committed: Mon Dec 5 22:26:18 2016 +0100 ---------------------------------------------------------------------- .../apache/johnzon/jsonb/JohnzonBuilder.java | 14 ++- .../johnzon/jsonb/JsonbVisitilityTest.java | 106 +++++++++++++++++++ 2 files changed, 119 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/a89915df/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 673877a..137cf4c 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 @@ -38,6 +38,7 @@ import javax.json.bind.Jsonb; import javax.json.bind.JsonbBuilder; import javax.json.bind.JsonbConfig; import javax.json.bind.adapter.JsonbAdapter; +import javax.json.bind.annotation.JsonbProperty; import javax.json.bind.annotation.JsonbVisibility; import javax.json.bind.config.BinaryDataStrategy; import javax.json.bind.config.PropertyNamingStrategy; @@ -156,6 +157,9 @@ public class JohnzonBuilder implements JsonbBuilder { @Override public boolean isVisible(final Field field) { + if (field.getAnnotation(JsonbProperty.class) != null) { + return true; + } final PropertyVisibilityStrategy strategy = strategies.computeIfAbsent(field.getDeclaringClass(), this::visibilityStrategy); return strategy == this ? Modifier.isPublic(field.getModifiers()) : strategy.isVisible(field); } @@ -167,9 +171,17 @@ public class JohnzonBuilder implements JsonbBuilder { } private PropertyVisibilityStrategy visibilityStrategy(final Class<?> type) { // can be cached + JsonbVisibility visibility = type.getAnnotation(JsonbVisibility.class); + if (visibility != null) { + try { + return visibility.value().newInstance(); + } catch (final InstantiationException | IllegalAccessException e) { + throw new IllegalArgumentException(e); + } + } Package p = type.getPackage(); while (p != null) { - final JsonbVisibility visibility = p.getAnnotation(JsonbVisibility.class); + visibility = p.getAnnotation(JsonbVisibility.class); if (visibility != null) { try { return visibility.value().newInstance(); http://git-wip-us.apache.org/repos/asf/johnzon/blob/a89915df/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbVisitilityTest.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbVisitilityTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbVisitilityTest.java new file mode 100644 index 0000000..9fe45aa --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbVisitilityTest.java @@ -0,0 +1,106 @@ +/* + * 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 java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import javax.json.bind.Jsonb; +import javax.json.bind.annotation.JsonbProperty; +import javax.json.bind.annotation.JsonbVisibility; +import javax.json.bind.config.PropertyVisibilityStrategy; +import javax.json.bind.spi.JsonbProvider; + +import org.junit.Assert; +import org.junit.Test; + +public class JsonbVisitilityTest { + + @Test + public void testJsonVisibilityAllFields() { + MyDataVisibility data = new MyDataVisibility(); + data.put("x", "a"); + data.put("y", "b"); + + Jsonb jsonb = JsonbProvider.provider().create().build(); + String json = jsonb.toJson(data); + Assert.assertEquals("{\"attribs\":{\"x\":\"a\",\"y\":\"b\"}}", json); + + MyDataVisibility dataBack = jsonb.fromJson(json, MyDataVisibility.class); + Assert.assertEquals("a", dataBack.get("x")); + Assert.assertEquals("b", dataBack.get("y")); + } + + @Test + public void testJsonPropertyInternalField() { + MyDataJsonField data = new MyDataJsonField(); + data.put("x", "a"); + data.put("y", "b"); + + Jsonb jsonb = JsonbProvider.provider().create().build(); + String json = jsonb.toJson(data); + Assert.assertEquals("{\"attribs\":{\"x\":\"a\",\"y\":\"b\"}}", json); + + MyDataJsonField dataBack = jsonb.fromJson(json, MyDataJsonField.class); + Assert.assertEquals("a", dataBack.get("x")); + Assert.assertEquals("b", dataBack.get("y")); + } + + + @JsonbVisibility(VisibleAllFields.class) + public static class MyDataVisibility { + private Map<String, String> attribs = new HashMap<>(); + + public void put(String key, String value) { + attribs.put(key, value); + } + + public String get(String key) { + return attribs.get(key); + } + } + + public static class MyDataJsonField { + @JsonbProperty + private Map<String, String> attribs = new HashMap<>(); + + public void put(String key, String value) { + attribs.put(key, value); + } + + public String get(String key) { + return attribs.get(key); + } + } + + /** + * All fields are visible. Even private, which by default won't get jsonified. + */ + public static class VisibleAllFields implements PropertyVisibilityStrategy { + @Override + public boolean isVisible(Field field) { + return true; + } + + @Override + public boolean isVisible(Method method) { + return false; + } + } +}
