diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java index 0da35ff7f..1df32b860 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java @@ -281,7 +281,12 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri } addProperty(o, MAIN_DEPARTMENT, user.getMainDepartment()); - addArrayProperty(o, DIRECT_LEADER, user.getDirectLeader()); + // Special handling for directLeader: include empty arrays to support WeChat Work API reset functionality + if (user.getDirectLeader() != null) { + JsonArray directLeaderArray = new JsonArray(); + Arrays.stream(user.getDirectLeader()).forEach(directLeaderArray::add); + o.add(DIRECT_LEADER, directLeaderArray); + } if (!user.getExtAttrs().isEmpty()) { JsonArray attrsJsonArray = new JsonArray(); diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java index 9b62a8d58..66be5c66a 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java @@ -180,4 +180,31 @@ public class WxCpUserGsonAdapterTest { "{\"type\":2,\"name\":\"测试app\"," + "\"miniprogram\":{\"appid\":\"wx8bd80126147df384\",\"pagepath\":\"/index\",\"title\":\"my miniprogram\"}}]}}"); } + + /** + * Test directLeader empty array serialization. + * This test verifies that empty directLeader arrays are included in JSON as "direct_leader":[] + * instead of being omitted, which is required for WeChat Work API to reset user direct leaders. + */ + @Test + public void testDirectLeaderEmptyArraySerialization() { + WxCpUser user = new WxCpUser(); + user.setUserId("testuser"); + user.setName("Test User"); + + // Test with empty array - should be serialized as "direct_leader":[] + user.setDirectLeader(new String[]{}); + String json = user.toJson(); + assertThat(json).contains("\"direct_leader\":[]"); + + // Test with null - should not include direct_leader field + user.setDirectLeader(null); + json = user.toJson(); + assertThat(json).doesNotContain("direct_leader"); + + // Test with non-empty array - should be serialized normally + user.setDirectLeader(new String[]{"leader1", "leader2"}); + json = user.toJson(); + assertThat(json).contains("\"direct_leader\":[\"leader1\",\"leader2\"]"); + } }