Skip to content

Commit 3e0d39b

Browse files
authored
Add Optional<JsonNode> JsonNode.asOptional() convenience method for #4867 (#4872)
1 parent bdd667e commit 3e0d39b

File tree

5 files changed

+56
-0
lines changed

5 files changed

+56
-0
lines changed

release-notes/VERSION-2.x

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ Project: jackson-databind
3636
(reported by Kornel Zemla)
3737
#4863: Add basic Stream support in `JsonNode`: `valueStream()`, `propertyStream()`,
3838
`forEachEntry()`
39+
#4867: Add `Optional<JsonNode> JsonNode.asOptional()` convenience method
40+
(fix by Joo-Hyuk K)
3941

4042
2.18.3 (not yet released)
4143

src/main/java/com/fasterxml/jackson/databind/JsonNode.java

+11
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,17 @@ public boolean asBoolean(boolean defaultValue) {
759759
return defaultValue;
760760
}
761761

762+
/**
763+
* Method that will return a {@link JsonNode} wrapped in Java's {@link Optional}.
764+
*
765+
* @return `Optional<JsonNode>` containing this node, or {@link Optional#empty()}
766+
* if this is a {@link MissingNode}.
767+
* @since 2.19
768+
*/
769+
public Optional<JsonNode> asOptional() {
770+
return Optional.of(this);
771+
}
772+
762773
/*
763774
/**********************************************************************
764775
/* Public API, extended traversal (2.10) with "required()"

src/main/java/com/fasterxml/jackson/databind/node/MissingNode.java

+6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.fasterxml.jackson.databind.node;
22

33
import java.io.IOException;
4+
import java.util.Optional;
45

56
import com.fasterxml.jackson.core.*;
67
import com.fasterxml.jackson.databind.JsonNode;
@@ -71,6 +72,11 @@ public JsonNodeType getNodeType()
7172
public boolean asBoolean(boolean defaultValue);
7273
*/
7374

75+
@Override
76+
public Optional<JsonNode> asOptional() {
77+
return Optional.empty();
78+
}
79+
7480
/*
7581
/**********************************************************
7682
/* Serialization: bit tricky as we don't really have a value

src/test/java/com/fasterxml/jackson/databind/node/JsonNodeBasicTest.java

+34
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.fasterxml.jackson.databind.node;
22

33
import java.util.Comparator;
4+
import java.util.Optional;
45

56
import org.junit.jupiter.api.Test;
67

@@ -215,4 +216,37 @@ public void testArrayWithDefaultTyping() throws Exception
215216
assertEquals(1, obj.size());
216217
assertEquals(2, obj.path("a").asInt());
217218
}
219+
220+
// [databind#4867]
221+
@Test
222+
public void testAsOptional() {
223+
// Test with MissingNode
224+
JsonNode missingNode = MissingNode.getInstance();
225+
Optional<JsonNode> missingOptional = missingNode.asOptional();
226+
assertFalse(missingOptional.isPresent());
227+
228+
// Test with ObjectNode
229+
ObjectNode objectNode = MAPPER.createObjectNode();
230+
Optional<JsonNode> objectOptional = objectNode.asOptional();
231+
assertTrue(objectOptional.isPresent());
232+
assertEquals(objectNode, objectOptional.get());
233+
234+
// Test with ArrayNode
235+
ArrayNode arrayNode = MAPPER.createArrayNode();
236+
Optional<JsonNode> arrayOptional = arrayNode.asOptional();
237+
assertTrue(arrayOptional.isPresent());
238+
assertEquals(arrayNode, arrayOptional.get());
239+
240+
// Test with TextNode
241+
TextNode textNode = TextNode.valueOf("text");
242+
Optional<JsonNode> textOptional = textNode.asOptional();
243+
assertTrue(textOptional.isPresent());
244+
assertEquals(textNode, textOptional.get());
245+
246+
// Test with NullNode
247+
NullNode nullNode = NullNode.getInstance();
248+
Optional<JsonNode> nullOptional = nullNode.asOptional();
249+
assertTrue(nullOptional.isPresent());
250+
assertEquals(nullNode, nullOptional.get());
251+
}
218252
}

src/test/java/com/fasterxml/jackson/databind/node/MissingNodeTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public void testMissingViaMapper() throws Exception
6262
assertTrue(onode.isObject());
6363
assertEquals(0, onode.size());
6464
assertFalse(onode.isMissingNode()); // real node
65+
assertTrue(onode.asOptional().isPresent());
6566
assertNull(onode.textValue());
6667

6768
// how about dereferencing?
@@ -74,6 +75,7 @@ public void testMissingViaMapper() throws Exception
7475
JsonNode dummyNode2 = dummyNode.path(98);
7576
assertNotNull(dummyNode2);
7677
assertTrue(dummyNode2.isMissingNode());
78+
assertFalse(dummyNode2.asOptional().isPresent());
7779
JsonNode dummyNode3 = dummyNode.path("field");
7880
assertNotNull(dummyNode3);
7981
assertTrue(dummyNode3.isMissingNode());
@@ -92,6 +94,7 @@ public void testMissingViaMapper() throws Exception
9294
assertTrue(dummyNode.isMissingNode());
9395
assertNull(dummyNode.get(0));
9496
assertNull(dummyNode.get("myfield"));
97+
assertFalse(dummyNode.asOptional().isPresent());
9598
dummyNode2 = dummyNode.path(98);
9699
assertNotNull(dummyNode2);
97100
assertTrue(dummyNode2.isMissingNode());

0 commit comments

Comments
 (0)