diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/visitor/FromFlatJsonVisitor.java b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/FromFlatJsonVisitor.java index 7ffed4ed5..d38194e01 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/visitor/FromFlatJsonVisitor.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/FromFlatJsonVisitor.java @@ -23,6 +23,10 @@ import li.strolch.utils.collections.MapOfSets; * empty set with the bag id. *

* + *

+ * Optional values are handled similar, but only a parameter can be optional, not a whole bag + *

+ * * @author Robert von Burg * * @param @@ -30,13 +34,16 @@ import li.strolch.utils.collections.MapOfSets; public class FromFlatJsonVisitor { private MapOfSets ignoredKeys; + private MapOfSets optionalKeys; public FromFlatJsonVisitor() { this.ignoredKeys = new MapOfSets<>(); + this.optionalKeys = new MapOfSets<>(); } public FromFlatJsonVisitor(MapOfSets ignoredParams) { this.ignoredKeys = new MapOfSets<>(); + this.optionalKeys = new MapOfSets<>(); } public void ignoreBag(String bagId) { @@ -47,14 +54,18 @@ public class FromFlatJsonVisitor { this.ignoredKeys.addElement(bagId, paramId); } + public void optionalParameter(String bagId, String paramId) { + this.optionalKeys.addElement(bagId, paramId); + } + public void visit(T element, JsonObject jsonObject) { Set bagKeySet = element.getParameterBagKeySet(); for (String bagId : bagKeySet) { // see if we have to ignore this bag i.e. empty set existing - Set paramIds = this.ignoredKeys.getSet(bagId); - if (paramIds != null && paramIds.isEmpty()) + Set ignoredParamIds = this.ignoredKeys.getSet(bagId); + if (ignoredParamIds != null && ignoredParamIds.isEmpty()) continue; ParameterBag parameterBag = element.getParameterBag(bagId); @@ -63,12 +74,15 @@ public class FromFlatJsonVisitor { for (String paramId : parameterKeySet) { // see if this parameter must be ignored - if (paramIds != null && paramIds.contains(paramId)) + if (ignoredParamIds != null && ignoredParamIds.contains(paramId)) continue; JsonElement jsonElement = jsonObject.get(paramId); - if (jsonElement == null) + if (jsonElement == null) { + if (this.optionalKeys.containsElement(bagId, paramId)) + continue; throw new StrolchModelException("JsonObject is missing member with ID " + paramId); + } if (!jsonElement.isJsonPrimitive()) { throw new StrolchModelException("JsonElement " + paramId + " is not a json primitive but a " diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ToFlatJsonVisitor.java b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ToFlatJsonVisitor.java index 9cac20e3b..e9c297110 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ToFlatJsonVisitor.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/visitor/ToFlatJsonVisitor.java @@ -69,8 +69,8 @@ public class ToFlatJsonVisitor { for (String bagId : bagKeySet) { // see if we have to ignore this bag i.e. empty set existing - Set paramIds = this.ignoredKeys.getSet(bagId); - if (paramIds != null && paramIds.isEmpty()) + Set ignoredParamIds = this.ignoredKeys.getSet(bagId); + if (ignoredParamIds != null && ignoredParamIds.isEmpty()) continue; ParameterBag parameterBag = element.getParameterBag(bagId); @@ -79,7 +79,7 @@ public class ToFlatJsonVisitor { for (String paramId : parameterKeySet) { // see if this parameter must be ignored - if (paramIds != null && paramIds.contains(paramId)) + if (ignoredParamIds != null && ignoredParamIds.contains(paramId)) continue; if (jsonObject.has(paramId)) {