From bada9ceea12b91eac5acf012a60090aa3f1d7e4a Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Thu, 8 Jul 2021 12:01:27 +0800 Subject: [PATCH] Support default value in jsonpath mapping #216 --- .../main/java/we/fizz/input/PathMapping.java | 56 +++++++++++++++---- .../java/we/fizz/input/PathMappingTests.java | 4 +- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/fizz-core/src/main/java/we/fizz/input/PathMapping.java b/fizz-core/src/main/java/we/fizz/input/PathMapping.java index 2b0c6f8..91b1a92 100644 --- a/fizz-core/src/main/java/we/fizz/input/PathMapping.java +++ b/fizz-core/src/main/java/we/fizz/input/PathMapping.java @@ -135,39 +135,73 @@ public class PathMapping { String starEntryKey = null; for (Entry entry : rs.entrySet()) { - String path = handlePath(entry.getValue()); - ONode val = select(ctxNode, path); - Object obj = val; - if (val != null && types.containsKey(entry.getKey())) { + String path = entry.getValue(); + String p = path; + String defaultValue = null; + if (path.indexOf("|") != -1) { + p = path.substring(0, path.indexOf("|")); + defaultValue = path.substring(path.indexOf("|") + 1); + } + ONode val = select(ctxNode, handlePath(p)); + + Object obj = null; + if (val != null && !val.isNull()) { + obj = val; + } else { + obj = defaultValue; + } + if (obj != null && types.containsKey(entry.getKey())) { switch (types.get(entry.getKey())) { case "Integer": case "int": { - obj = val.val().isNull() ? null : val.val().getInt(); + if (obj instanceof ONode) { + obj = ((ONode) obj).val().getInt(); + } else { + obj = Integer.valueOf(obj.toString()); + } break; } case "Boolean": case "boolean": { - obj = val.val().isNull() ? null : val.val().getBoolean(); + if (obj instanceof ONode) { + obj = ((ONode) obj).val().getBoolean(); + } else { + obj = Boolean.valueOf(obj.toString()); + } break; } case "Float": case "float": { - obj = val.val().isNull() ? null : val.val().getFloat(); + if (obj instanceof ONode) { + obj = ((ONode) obj).val().getFloat(); + } else { + obj = Float.valueOf(obj.toString()); + } break; } case "Double": case "double": { - obj = val.val().isNull() ? null : val.val().getDouble(); + if (obj instanceof ONode) { + obj = ((ONode) obj).val().getDouble(); + } else { + obj = Double.valueOf(obj.toString()); + } break; } case "String": case "string": { - obj = val.val().isNull() ? null : val.val().getString(); + if (obj instanceof ONode) { + obj = ((ONode) obj).val().getString(); + } break; } case "Long": case "long": { - obj = val.val().isNull() ? null : val.val().getLong(); + if (obj instanceof ONode) { + obj = ((ONode) obj).val().getLong(); + } else { + obj = Long.valueOf(obj.toString()); + } break; } } @@ -175,7 +209,7 @@ public class PathMapping { if (CommonConstants.WILDCARD_STAR.equals(entry.getKey())) { starValObj = obj; starEntryKey = entry.getKey(); - }else { + } else { setByPath(target, entry.getKey(), obj, supportMultiLevels); } } diff --git a/fizz-core/src/test/java/we/fizz/input/PathMappingTests.java b/fizz-core/src/test/java/we/fizz/input/PathMappingTests.java index 4fd6475..4936d2b 100644 --- a/fizz-core/src/test/java/we/fizz/input/PathMappingTests.java +++ b/fizz-core/src/test/java/we/fizz/input/PathMappingTests.java @@ -14,6 +14,9 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.noear.snack.ONode; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + class PathMappingTests { @Test @@ -159,7 +162,6 @@ class PathMappingTests { assertEquals("1", (String)abcVal1); assertEquals("123456", (String)abcVal2); - }