diff --git a/src/main/java/org/kiwiproject/json/JsonHelper.java b/src/main/java/org/kiwiproject/json/JsonHelper.java index cbd5ced5..97e7d377 100644 --- a/src/main/java/org/kiwiproject/json/JsonHelper.java +++ b/src/main/java/org/kiwiproject/json/JsonHelper.java @@ -319,6 +319,11 @@ public String toJsonFromKeyValuePairs(Object... kvPairs) { /** * Convert the given object to JSON, but ignoring (excluding) the given paths. + *

+ * Note that if the input object is {@code null}, then the returned value is + * the string literal {@code "null"}. The reason is that a {@code null} object + * is represented as a {@link NullNode}, and its {@code toString} method returns + * the literal {@code "null"}. * * @param object the object to convert * @param ignoredPaths the paths to ignore/exclude diff --git a/src/test/java/org/kiwiproject/json/JsonHelperBasicsTest.java b/src/test/java/org/kiwiproject/json/JsonHelperBasicsTest.java index 748f598c..2a5400f4 100644 --- a/src/test/java/org/kiwiproject/json/JsonHelperBasicsTest.java +++ b/src/test/java/org/kiwiproject/json/JsonHelperBasicsTest.java @@ -343,6 +343,15 @@ void shouldIgnoreNestedPaths() { var workAddress = (Map) sanitizedBob.get("workAddress"); assertThat(workAddress).doesNotContainKeys("street1", "street2"); } + + @Test + void shouldHandleNullInput_WhenIgnoringPaths() { + var json = jsonHelper.toJsonIgnoringPaths(null, "username", "password"); + + assertThat(json) + .describedAs("Null input should result in a literal \"null\" String value") + .isEqualTo("null"); + } } @Nested @@ -515,6 +524,17 @@ void shouldReturnEmptyOptional_WhenGivenNullOrEmptyInput(String value) { void shouldReturnEmptyOptional_WhenGivenBlankInput(String value) { assertThat(jsonHelper.toObjectOptional(value, Person.class)).isEmpty(); } + + @Test + void shouldReturnDefaultObject_WhenGivenEmptyJson() { + assertThat(jsonHelper.toObjectOptional("{}", Person.class)) + .describedAs("Return value should be the 'default' object") + .contains(new Person(null, null, 0)); + + assertThat(jsonHelper.toObjectOptional("{}", User.class)) + .describedAs("Return value should be the 'default' object") + .contains(User.builder().luckyNumbers(null).build()); + } } @Nested