diff --git a/kraken-java-sdk/kraken-java-sdk-core/src/main/java/com/consoleconnect/kraken/operator/core/toolkit/JsonToolkit.java b/kraken-java-sdk/kraken-java-sdk-core/src/main/java/com/consoleconnect/kraken/operator/core/toolkit/JsonToolkit.java index 51c8be974..8be7f4961 100644 --- a/kraken-java-sdk/kraken-java-sdk-core/src/main/java/com/consoleconnect/kraken/operator/core/toolkit/JsonToolkit.java +++ b/kraken-java-sdk/kraken-java-sdk-core/src/main/java/com/consoleconnect/kraken/operator/core/toolkit/JsonToolkit.java @@ -8,17 +8,18 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import com.fasterxml.jackson.databind.node.*; import com.fasterxml.jackson.datatype.joda.JodaModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; import java.util.Iterator; import java.util.Map; + +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +@Slf4j public class JsonToolkit { private JsonToolkit() {} @@ -111,6 +112,43 @@ public static String generateJson(String jsonPointerPath, String value, String i } } + public static String generateJsonDynamic(String jsonPointerPath, String value, String initJson) { + initJson = StringUtils.isBlank(initJson) ? "{}" : initJson; + try { + ObjectMapper mapper = new ObjectMapper(); + JsonNode root = mapper.readTree(initJson); + JsonNode valueNode = createNodeFromValue(value, mapper); + setJsonPointerValue(root, JsonPointer.compile(jsonPointerPath), valueNode, mapper); + return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(root); + } catch (JsonProcessingException e) { + throw KrakenException.internalError(e.getMessage()); + } + } + + private static JsonNode createNodeFromValue(String value, ObjectMapper mapper) { + if (value == null) { + return NullNode.instance; + } + try { + return mapper.readTree(value); + } catch (Exception e) { + log.error("not valid JSON, fall back to other types"); + } + if (StringUtils.isNumeric(value)) { + try { + long longValue = Long.parseLong(value); + log.info("long value{}", longValue); + return JsonNodeFactory.instance.numberNode(longValue); + } catch (NumberFormatException e) { + return JsonNodeFactory.instance.numberNode(new java.math.BigDecimal(value)); + } + } else if ("true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value)) { + return BooleanNode.valueOf(Boolean.parseBoolean(value)); + } else { + return JsonNodeFactory.instance.textNode(value); + } + } + public static void setJsonPointerValue( JsonNode node, JsonPointer pointer, JsonNode value, ObjectMapper mapper) { JsonPointer parentPointer = pointer.head(); diff --git a/kraken-java-sdk/kraken-java-sdk-core/src/test/java/com/consoleconnect/kraken/operator/core/toolkit/JsonPathTests.java b/kraken-java-sdk/kraken-java-sdk-core/src/test/java/com/consoleconnect/kraken/operator/core/toolkit/JsonPathTests.java index ac6210eb8..9c0740c93 100644 --- a/kraken-java-sdk/kraken-java-sdk-core/src/test/java/com/consoleconnect/kraken/operator/core/toolkit/JsonPathTests.java +++ b/kraken-java-sdk/kraken-java-sdk-core/src/test/java/com/consoleconnect/kraken/operator/core/toolkit/JsonPathTests.java @@ -37,4 +37,15 @@ public String compactJson(String jsonString) throws JsonProcessingException { Object jsonObject = mapper.readValue(jsonString, Object.class); return mapper.writeValueAsString(jsonObject); } + + @SneakyThrows + @Test + void givenJsonPath_whenGenerateDynamicJson_returnOK() { + String s1 = JsonToolkit.generateJsonDynamic("/user/class/0/name", "John", "{}"); + String s2 = JsonToolkit.generateJsonDynamic("/user/class/0/password", "password", s1); + String s3 = JsonToolkit.generateJsonDynamic("/user/class/0/secret/key", "secretKey", s2); + String s4 = JsonToolkit.generateJsonDynamic("/user/class/0/deposit/amount", "123456", s3); + log.info("final result: {}", s4); + assertThat(s4, hasJsonPath("$.user.class[0].deposit.amount", equalTo(123456))); + } }