Skip to content

Commit a9e9a8d

Browse files
authored
support null data in nodes (#4380)
1 parent 901ba02 commit a9e9a8d

File tree

3 files changed

+53
-4
lines changed

3 files changed

+53
-4
lines changed

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.IOException;
44
import java.math.BigDecimal;
55
import java.math.BigInteger;
6+
import java.util.Objects;
67

78
import com.fasterxml.jackson.core.*;
89
import com.fasterxml.jackson.databind.SerializerProvider;
@@ -113,11 +114,12 @@ public boolean equals(Object o)
113114
if (!(o instanceof BigIntegerNode)) {
114115
return false;
115116
}
116-
return ((BigIntegerNode) o)._value.equals(_value);
117+
BigIntegerNode otherNode = (BigIntegerNode) o;
118+
return Objects.equals(otherNode._value, _value);
117119
}
118120

119121
@Override
120122
public int hashCode() {
121-
return _value.hashCode();
123+
return Objects.hashCode(_value);
122124
}
123125
}

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

+14-2
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,23 @@ public boolean equals(Object o)
126126
if (o == this) return true;
127127
if (o == null) return false;
128128
if (o instanceof DecimalNode) {
129-
return ((DecimalNode) o)._value.compareTo(_value) == 0;
129+
DecimalNode otherNode = (DecimalNode) o;
130+
if (otherNode._value == null) {
131+
return _value == null;
132+
} else if (_value == null) {
133+
return false;
134+
}
135+
return otherNode._value.compareTo(_value) == 0;
130136
}
131137
return false;
132138
}
133139

134140
@Override
135-
public int hashCode() { return Double.valueOf(doubleValue()).hashCode(); }
141+
public int hashCode() {
142+
if (_value == null) {
143+
// we need a stable hash code for _value == null
144+
return 0;
145+
}
146+
return Double.valueOf(doubleValue()).hashCode();
147+
}
136148
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.fasterxml.jackson.databind.node;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.math.BigDecimal;
6+
import java.math.BigInteger;
7+
8+
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
import static org.junit.jupiter.api.Assertions.assertNotEquals;
10+
11+
public class NullDataEqualsTest {
12+
@Test
13+
void testNullBinaryNode() {
14+
assertEquals(new BinaryNode(null), new BinaryNode(null));
15+
assertNotEquals(new BinaryNode(new byte[8]), new BinaryNode(null));
16+
assertNotEquals(new BinaryNode(null), new BinaryNode(new byte[8]));
17+
assertEquals(-1, new BinaryNode(null).hashCode());
18+
}
19+
20+
@Test
21+
void testNullBigIntegerNode() {
22+
assertEquals(new BigIntegerNode(null), new BigIntegerNode(null));
23+
assertNotEquals(new BigIntegerNode(BigInteger.ZERO), new BigIntegerNode(null));
24+
assertNotEquals(new BigIntegerNode(null), new BigIntegerNode(BigInteger.ZERO));
25+
assertEquals(0, new BigIntegerNode(null).hashCode());
26+
}
27+
28+
@Test
29+
void testNullDecimalNode() {
30+
assertEquals(new DecimalNode(null), new DecimalNode(null));
31+
assertNotEquals(new DecimalNode(BigDecimal.ZERO), new DecimalNode(null));
32+
assertNotEquals( new DecimalNode(null), new DecimalNode(BigDecimal.ZERO));
33+
assertEquals(0, new DecimalNode(null).hashCode());
34+
}
35+
}

0 commit comments

Comments
 (0)