Skip to content

Commit ef68a5d

Browse files
halibobo1205claude
andcommitted
feat: add equals/hashCode to JSONArray and JSONObject wrappers
Delegate to Jackson's ArrayNode/ObjectNode structural equality, matching Fastjson's HashMap/ArrayList-based behavior. Add 20 unit tests covering identity, content, nested, empty, null, and cross-type comparisons. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7343e96 commit ef68a5d

3 files changed

Lines changed: 169 additions & 0 deletions

File tree

common/src/main/java/org/tron/json/JSONArray.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,20 @@ public String toString() {
234234
public String toJSONString() {
235235
return toString();
236236
}
237+
238+
@Override
239+
public boolean equals(Object o) {
240+
if (this == o) {
241+
return true;
242+
}
243+
if (!(o instanceof JSONArray)) {
244+
return false;
245+
}
246+
return node.equals(((JSONArray) o).node);
247+
}
248+
249+
@Override
250+
public int hashCode() {
251+
return node.hashCode();
252+
}
237253
}

common/src/main/java/org/tron/json/JSONObject.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,4 +508,20 @@ public String toString() {
508508
public String toJSONString() {
509509
return toString();
510510
}
511+
512+
@Override
513+
public boolean equals(Object o) {
514+
if (this == o) {
515+
return true;
516+
}
517+
if (!(o instanceof JSONObject)) {
518+
return false;
519+
}
520+
return node.equals(((JSONObject) o).node);
521+
}
522+
523+
@Override
524+
public int hashCode() {
525+
return node.hashCode();
526+
}
511527
}

framework/src/test/java/org/tron/json/JsonCompatibilityFuzzTest.java

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.junit.Assert.assertEquals;
44
import static org.junit.Assert.assertFalse;
5+
import static org.junit.Assert.assertNotEquals;
56
import static org.junit.Assert.assertNotNull;
67
import static org.junit.Assert.assertNull;
78
import static org.junit.Assert.assertTrue;
@@ -2609,4 +2610,140 @@ public void testArrayGetJSONArrayFromStringifiedElement() {
26092610
assertEquals(3, nested.size());
26102611
assertEquals(1, nested.get(0));
26112612
}
2613+
2614+
// ── JSONArray equals / hashCode ──────────────────────────────
2615+
2616+
@Test
2617+
public void testArrayEqualsSameContent() {
2618+
JSONArray a = JSONArray.parseArray("[1,\"two\",true,null]");
2619+
JSONArray b = JSONArray.parseArray("[1,\"two\",true,null]");
2620+
assertEquals(a, b);
2621+
assertEquals(a.hashCode(), b.hashCode());
2622+
}
2623+
2624+
@Test
2625+
public void testArrayEqualsDifferentContent() {
2626+
JSONArray a = JSONArray.parseArray("[1,2,3]");
2627+
JSONArray b = JSONArray.parseArray("[1,2,4]");
2628+
assertNotEquals(a, b);
2629+
}
2630+
2631+
@Test
2632+
public void testArrayEqualsBuiltVsParsed() {
2633+
JSONArray built = new JSONArray();
2634+
built.add(1);
2635+
built.add("hello");
2636+
built.add(true);
2637+
JSONArray parsed = JSONArray.parseArray("[1,\"hello\",true]");
2638+
assertEquals(built, parsed);
2639+
assertEquals(built.hashCode(), parsed.hashCode());
2640+
}
2641+
2642+
@Test
2643+
public void testArrayEqualsEmpty() {
2644+
assertEquals(new JSONArray(), JSONArray.parseArray("[]"));
2645+
}
2646+
2647+
@Test
2648+
public void testArrayEqualsNested() {
2649+
JSONArray a = JSONArray.parseArray("[[1,2],[3,4]]");
2650+
JSONArray b = JSONArray.parseArray("[[1,2],[3,4]]");
2651+
assertEquals(a, b);
2652+
assertEquals(a.hashCode(), b.hashCode());
2653+
}
2654+
2655+
@Test
2656+
public void testArrayNotEqualsNull() {
2657+
assertNotEquals(new JSONArray(), null);
2658+
}
2659+
2660+
@Test
2661+
public void testArrayNotEqualsOtherType() {
2662+
assertNotEquals(new JSONArray(), "[]");
2663+
}
2664+
2665+
@Test
2666+
public void testArrayEqualsSelf() {
2667+
JSONArray a = JSONArray.parseArray("[1]");
2668+
assertEquals(a, a);
2669+
}
2670+
2671+
@Test
2672+
public void testArrayEqualsOrderMatters() {
2673+
JSONArray a = JSONArray.parseArray("[1,2]");
2674+
JSONArray b = JSONArray.parseArray("[2,1]");
2675+
assertNotEquals(a, b);
2676+
}
2677+
2678+
// ── JSONObject equals / hashCode ─────────────────────────────
2679+
2680+
@Test
2681+
public void testObjectEqualsSameContent() {
2682+
JSONObject a = JSON.parseObject("{\"k\":1,\"v\":\"two\"}");
2683+
JSONObject b = JSON.parseObject("{\"k\":1,\"v\":\"two\"}");
2684+
assertEquals(a, b);
2685+
assertEquals(a.hashCode(), b.hashCode());
2686+
}
2687+
2688+
@Test
2689+
public void testObjectEqualsDifferentContent() {
2690+
JSONObject a = JSON.parseObject("{\"k\":1}");
2691+
JSONObject b = JSON.parseObject("{\"k\":2}");
2692+
assertNotEquals(a, b);
2693+
}
2694+
2695+
@Test
2696+
public void testObjectEqualsBuiltVsParsed() {
2697+
JSONObject built = new JSONObject();
2698+
built.put("name", "test");
2699+
built.put("count", 42);
2700+
JSONObject parsed = JSON.parseObject("{\"name\":\"test\",\"count\":42}");
2701+
assertEquals(built, parsed);
2702+
assertEquals(built.hashCode(), parsed.hashCode());
2703+
}
2704+
2705+
@Test
2706+
public void testObjectEqualsEmpty() {
2707+
assertEquals(new JSONObject(), JSON.parseObject("{}"));
2708+
}
2709+
2710+
@Test
2711+
public void testObjectEqualsNested() {
2712+
JSONObject a = JSON.parseObject("{\"inner\":{\"x\":1}}");
2713+
JSONObject b = JSON.parseObject("{\"inner\":{\"x\":1}}");
2714+
assertEquals(a, b);
2715+
assertEquals(a.hashCode(), b.hashCode());
2716+
}
2717+
2718+
@Test
2719+
public void testObjectNotEqualsNull() {
2720+
assertNotEquals(new JSONObject(), null);
2721+
}
2722+
2723+
@Test
2724+
public void testObjectNotEqualsOtherType() {
2725+
assertNotEquals(new JSONObject(), "{}");
2726+
}
2727+
2728+
@Test
2729+
public void testObjectEqualsSelf() {
2730+
JSONObject a = JSON.parseObject("{\"k\":1}");
2731+
assertEquals(a, a);
2732+
}
2733+
2734+
@Test
2735+
public void testObjectEqualsDifferentKeys() {
2736+
JSONObject a = JSON.parseObject("{\"a\":1}");
2737+
JSONObject b = JSON.parseObject("{\"b\":1}");
2738+
assertNotEquals(a, b);
2739+
}
2740+
2741+
@Test
2742+
public void testObjectEqualsKeyOrderIndependent() {
2743+
// Jackson ObjectNode.equals is order-independent, same as Fastjson HashMap
2744+
JSONObject a = JSON.parseObject("{\"x\":1,\"y\":2}");
2745+
JSONObject b = JSON.parseObject("{\"y\":2,\"x\":1}");
2746+
assertEquals(a, b);
2747+
assertEquals(a.hashCode(), b.hashCode());
2748+
}
26122749
}

0 commit comments

Comments
 (0)