1 package com.fasterxml.jackson.databind.node; 2 3 import java.io.StringWriter; 4 import java.math.BigDecimal; 5 import java.math.BigInteger; 6 7 import com.fasterxml.jackson.databind.JsonNode; 8 import com.fasterxml.jackson.databind.ObjectMapper; 9 10 public class TestNullNode extends NodeTestBase 11 { 12 final static class CovarianceBean { 13 ObjectNode _object; 14 ArrayNode _array; 15 setObject(ObjectNode n)16 public void setObject(ObjectNode n) { _object = n; } setArray(ArrayNode n)17 public void setArray(ArrayNode n) { _array = n; } 18 } 19 20 @SuppressWarnings("serial") 21 static class MyNull extends NullNode { } 22 23 private final ObjectMapper MAPPER = sharedMapper(); 24 testBasicsWithNullNode()25 public void testBasicsWithNullNode() throws Exception 26 { 27 // Let's use something that doesn't add much beyond JsonNode base 28 NullNode n = NullNode.instance; 29 30 // basic properties 31 assertFalse(n.isContainerNode()); 32 assertFalse(n.isBigDecimal()); 33 assertFalse(n.isBigInteger()); 34 assertFalse(n.isBinary()); 35 assertFalse(n.isBoolean()); 36 assertFalse(n.isPojo()); 37 assertFalse(n.isMissingNode()); 38 39 // fallback accessors 40 assertFalse(n.booleanValue()); 41 assertNull(n.numberValue()); 42 assertEquals(0, n.intValue()); 43 assertEquals(0L, n.longValue()); 44 assertEquals(BigDecimal.ZERO, n.decimalValue()); 45 assertEquals(BigInteger.ZERO, n.bigIntegerValue()); 46 47 assertEquals(0, n.size()); 48 assertTrue(n.isEmpty()); 49 assertFalse(n.elements().hasNext()); 50 assertFalse(n.fieldNames().hasNext()); 51 // path is never null; but does point to missing node 52 assertNotNull(n.path("xyz")); 53 assertTrue(n.path("xyz").isMissingNode()); 54 55 assertFalse(n.has("field")); 56 assertFalse(n.has(3)); 57 58 assertNodeNumbersForNonNumeric(n); 59 60 // 2.4 61 assertEquals("foo", n.asText("foo")); 62 } 63 testNullHandling()64 public void testNullHandling() throws Exception 65 { 66 // First, a stand-alone null 67 JsonNode n = MAPPER.readTree("null"); 68 assertNotNull(n); 69 assertTrue(n.isNull()); 70 assertFalse(n.isNumber()); 71 assertFalse(n.isTextual()); 72 assertEquals("null", n.asText()); 73 assertEquals(n, NullNode.instance); 74 75 n = objectMapper().readTree("null"); 76 assertNotNull(n); 77 assertTrue(n.isNull()); 78 79 // Then object property 80 ObjectNode root = (ObjectNode) objectReader().readTree("{\"x\":null}"); 81 assertEquals(1, root.size()); 82 n = root.get("x"); 83 assertNotNull(n); 84 assertTrue(n.isNull()); 85 } 86 testNullSerialization()87 public void testNullSerialization() throws Exception 88 { 89 StringWriter sw = new StringWriter(); 90 MAPPER.writeValue(sw, NullNode.instance); 91 assertEquals("null", sw.toString()); 92 } 93 testNullHandlingCovariance()94 public void testNullHandlingCovariance() throws Exception 95 { 96 String JSON = "{\"object\" : null, \"array\" : null }"; 97 CovarianceBean bean = MAPPER.readValue(JSON, CovarianceBean.class); 98 99 ObjectNode on = bean._object; 100 assertNull(on); 101 102 ArrayNode an = bean._array; 103 assertNull(an); 104 } 105 106 @SuppressWarnings("unlikely-arg-type") testNullEquality()107 public void testNullEquality() throws Exception 108 { 109 JsonNode n = MAPPER.nullNode(); 110 assertTrue(n.isNull()); 111 assertEquals(n, new MyNull()); 112 assertEquals(new MyNull(), n); 113 114 assertFalse(n.equals(null)); 115 assertFalse(n.equals("foo")); 116 } 117 } 118