🎨 统一优化gson adapter类,抽取常量,优化重复代码
Some checks are pending
Publish to Maven Central / build-and-publish (push) Waiting to run

This commit is contained in:
Binary Wang 2025-07-16 13:50:47 +08:00
parent 3e4ee57e1c
commit aacfa947be
5 changed files with 325 additions and 319 deletions

View File

@ -1,11 +1,3 @@
/*
* KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved.
*
* This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended
* only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction
* arose from modification of the original source, or other redistribution of this source
* is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
*/
package me.chanjar.weixin.common.util.json;
import com.google.gson.*;
@ -14,6 +6,7 @@ import me.chanjar.weixin.common.bean.menu.WxMenuButton;
import me.chanjar.weixin.common.bean.menu.WxMenuRule;
import java.lang.reflect.Type;
import java.util.Optional;
/**
@ -21,96 +14,111 @@ import java.lang.reflect.Type;
*/
public class WxMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserializer<WxMenu> {
// JSON字段常量定义
private static final String FIELD_BUTTON = "button";
private static final String FIELD_MATCH_RULE = "matchrule";
private static final String FIELD_SUB_BUTTON = "sub_button";
private static final String FIELD_MENU = "menu";
// 菜单按钮字段常量
private static final String FIELD_TYPE = "type";
private static final String FIELD_NAME = "name";
private static final String FIELD_KEY = "key";
private static final String FIELD_URL = "url";
private static final String FIELD_MEDIA_ID = "media_id";
private static final String FIELD_ARTICLE_ID = "article_id";
private static final String FIELD_APP_ID = "appid";
private static final String FIELD_PAGE_PATH = "pagepath";
// 菜单规则字段常量
private static final String FIELD_TAG_ID = "tag_id";
private static final String FIELD_SEX = "sex";
private static final String FIELD_COUNTRY = "country";
private static final String FIELD_PROVINCE = "province";
private static final String FIELD_CITY = "city";
private static final String FIELD_CLIENT_PLATFORM_TYPE = "client_platform_type";
private static final String FIELD_LANGUAGE = "language";
@Override
public JsonElement serialize(WxMenu menu, Type typeOfSrc, JsonSerializationContext context) {
JsonObject json = new JsonObject();
JsonArray buttonArray = new JsonArray();
for (WxMenuButton button : menu.getButtons()) {
JsonObject buttonJson = convertToJson(button);
buttonArray.add(buttonJson);
}
json.add("button", buttonArray);
Optional.ofNullable(menu.getButtons())
.ifPresent(buttons -> buttons.stream()
.map(this::convertToJson)
.forEach(buttonArray::add));
json.add(FIELD_BUTTON, buttonArray);
if (menu.getMatchRule() != null) {
json.add("matchrule", convertToJson(menu.getMatchRule()));
json.add(FIELD_MATCH_RULE, convertToJson(menu.getMatchRule()));
}
return json;
}
protected JsonObject convertToJson(WxMenuButton button) {
JsonObject buttonJson = new JsonObject();
buttonJson.addProperty("type", button.getType());
buttonJson.addProperty("name", button.getName());
buttonJson.addProperty("key", button.getKey());
buttonJson.addProperty("url", button.getUrl());
buttonJson.addProperty("media_id", button.getMediaId());
buttonJson.addProperty("article_id", button.getArticleId());
buttonJson.addProperty("appid", button.getAppId());
buttonJson.addProperty("pagepath", button.getPagePath());
addPropertyIfNotNull(buttonJson, FIELD_TYPE, button.getType());
addPropertyIfNotNull(buttonJson, FIELD_NAME, button.getName());
addPropertyIfNotNull(buttonJson, FIELD_KEY, button.getKey());
addPropertyIfNotNull(buttonJson, FIELD_URL, button.getUrl());
addPropertyIfNotNull(buttonJson, FIELD_MEDIA_ID, button.getMediaId());
addPropertyIfNotNull(buttonJson, FIELD_ARTICLE_ID, button.getArticleId());
addPropertyIfNotNull(buttonJson, FIELD_APP_ID, button.getAppId());
addPropertyIfNotNull(buttonJson, FIELD_PAGE_PATH, button.getPagePath());
if (button.getSubButtons() != null && !button.getSubButtons().isEmpty()) {
JsonArray buttonArray = new JsonArray();
for (WxMenuButton sub_button : button.getSubButtons()) {
buttonArray.add(convertToJson(sub_button));
}
buttonJson.add("sub_button", buttonArray);
button.getSubButtons().stream()
.map(this::convertToJson)
.forEach(buttonArray::add);
buttonJson.add(FIELD_SUB_BUTTON, buttonArray);
}
return buttonJson;
}
protected JsonObject convertToJson(WxMenuRule menuRule) {
JsonObject matchRule = new JsonObject();
matchRule.addProperty("tag_id", menuRule.getTagId());
matchRule.addProperty("sex", menuRule.getSex());
matchRule.addProperty("country", menuRule.getCountry());
matchRule.addProperty("province", menuRule.getProvince());
matchRule.addProperty("city", menuRule.getCity());
matchRule.addProperty("client_platform_type", menuRule.getClientPlatformType());
matchRule.addProperty("language", menuRule.getLanguage());
addPropertyIfNotNull(matchRule, FIELD_TAG_ID, menuRule.getTagId());
addPropertyIfNotNull(matchRule, FIELD_SEX, menuRule.getSex());
addPropertyIfNotNull(matchRule, FIELD_COUNTRY, menuRule.getCountry());
addPropertyIfNotNull(matchRule, FIELD_PROVINCE, menuRule.getProvince());
addPropertyIfNotNull(matchRule, FIELD_CITY, menuRule.getCity());
addPropertyIfNotNull(matchRule, FIELD_CLIENT_PLATFORM_TYPE, menuRule.getClientPlatformType());
addPropertyIfNotNull(matchRule, FIELD_LANGUAGE, menuRule.getLanguage());
return matchRule;
}
@Deprecated
private WxMenuRule convertToRule(JsonObject json) {
WxMenuRule menuRule = new WxMenuRule();
//变态的微信接口这里居然反人类的使用和序列化时不一样的名字
//menuRule.setTagId(GsonHelper.getString(json,"tag_id"));
menuRule.setTagId(GsonHelper.getString(json, "group_id"));
menuRule.setSex(GsonHelper.getString(json, "sex"));
menuRule.setCountry(GsonHelper.getString(json, "country"));
menuRule.setProvince(GsonHelper.getString(json, "province"));
menuRule.setCity(GsonHelper.getString(json, "city"));
menuRule.setClientPlatformType(GsonHelper.getString(json, "client_platform_type"));
menuRule.setLanguage(GsonHelper.getString(json, "language"));
return menuRule;
private void addPropertyIfNotNull(JsonObject obj, String key, String value) {
if (value != null) {
obj.addProperty(key, value);
}
}
@Override
public WxMenu deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
/*
* 操蛋的微信
* 创建菜单时是 { button : ... }
* 查询菜单时是 { menu : { button : ... } }
* 现在企业号升级为企业微信后没有此问题因此需要单独处理
*/
JsonArray buttonsJson = json.getAsJsonObject().get("menu").getAsJsonObject().get("button").getAsJsonArray();
return this.buildMenuFromJson(buttonsJson);
JsonObject root = json.getAsJsonObject();
JsonArray buttonsJson = null;
if (root.has(FIELD_MENU)) {
JsonObject menuObj = root.getAsJsonObject(FIELD_MENU);
buttonsJson = menuObj.getAsJsonArray(FIELD_BUTTON);
} else if (root.has(FIELD_BUTTON)) {
buttonsJson = root.getAsJsonArray(FIELD_BUTTON);
}
if (buttonsJson == null) {
throw new JsonParseException("No button array found in menu JSON");
}
return buildMenuFromJson(buttonsJson);
}
protected WxMenu buildMenuFromJson(JsonArray buttonsJson) {
WxMenu menu = new WxMenu();
for (int i = 0; i < buttonsJson.size(); i++) {
JsonObject buttonJson = buttonsJson.get(i).getAsJsonObject();
for (JsonElement btnElem : buttonsJson) {
JsonObject buttonJson = btnElem.getAsJsonObject();
WxMenuButton button = convertFromJson(buttonJson);
menu.getButtons().add(button);
if (buttonJson.get("sub_button") == null || buttonJson.get("sub_button").isJsonNull()) {
continue;
}
JsonArray sub_buttonsJson = buttonJson.get("sub_button").getAsJsonArray();
for (int j = 0; j < sub_buttonsJson.size(); j++) {
JsonObject sub_buttonJson = sub_buttonsJson.get(j).getAsJsonObject();
button.getSubButtons().add(convertFromJson(sub_buttonJson));
if (buttonJson.has(FIELD_SUB_BUTTON) && buttonJson.get(FIELD_SUB_BUTTON).isJsonArray()) {
JsonArray sub_buttonsJson = buttonJson.getAsJsonArray(FIELD_SUB_BUTTON);
for (JsonElement subBtnElem : sub_buttonsJson) {
button.getSubButtons().add(convertFromJson(subBtnElem.getAsJsonObject()));
}
}
}
return menu;
@ -118,14 +126,14 @@ public class WxMenuGsonAdapter implements JsonSerializer<WxMenu>, JsonDeserializ
protected WxMenuButton convertFromJson(JsonObject json) {
WxMenuButton button = new WxMenuButton();
button.setName(GsonHelper.getString(json, "name"));
button.setKey(GsonHelper.getString(json, "key"));
button.setUrl(GsonHelper.getString(json, "url"));
button.setType(GsonHelper.getString(json, "type"));
button.setMediaId(GsonHelper.getString(json, "media_id"));
button.setArticleId(GsonHelper.getString(json, "article_id"));
button.setAppId(GsonHelper.getString(json, "appid"));
button.setPagePath(GsonHelper.getString(json, "pagepath"));
button.setName(GsonHelper.getString(json, FIELD_NAME));
button.setKey(GsonHelper.getString(json, FIELD_KEY));
button.setUrl(GsonHelper.getString(json, FIELD_URL));
button.setType(GsonHelper.getString(json, FIELD_TYPE));
button.setMediaId(GsonHelper.getString(json, FIELD_MEDIA_ID));
button.setArticleId(GsonHelper.getString(json, FIELD_ARTICLE_ID));
button.setAppId(GsonHelper.getString(json, FIELD_APP_ID));
button.setPagePath(GsonHelper.getString(json, FIELD_PAGE_PATH));
return button;
}

View File

@ -1,11 +1,3 @@
/*
* KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved.
*
* This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended
* only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction
* arose from modification of the original source, or other redistribution of this source
* is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
*/
package me.chanjar.weixin.cp.util.json;
import com.google.gson.*;
@ -23,46 +15,44 @@ import java.util.List;
*/
public class WxCpChatGsonAdapter implements JsonSerializer<WxCpChat>, JsonDeserializer<WxCpChat> {
public static final String FIELD_CHAT_ID = "chatid";
public static final String FIELD_NAME = "name";
public static final String FIELD_OWNER = "owner";
public static final String FIELD_USER_LIST = "userlist";
@Override
public JsonElement serialize(WxCpChat chat, Type typeOfSrc, JsonSerializationContext context) {
JsonObject json = new JsonObject();
if (chat.getId() != null) {
json.addProperty("chatid", chat.getId());
}
if (chat.getName() != null) {
json.addProperty("name", chat.getName());
}
if (chat.getOwner() != null) {
json.addProperty("owner", chat.getOwner());
}
if (chat.getUsers() != null) {
addPropertyIfNotNull(json, FIELD_CHAT_ID, chat.getId());
addPropertyIfNotNull(json, FIELD_NAME, chat.getName());
addPropertyIfNotNull(json, FIELD_OWNER, chat.getOwner());
if (chat.getUsers() != null && !chat.getUsers().isEmpty()) {
JsonArray users = new JsonArray();
for (String user : chat.getUsers()) {
users.add(user);
}
json.add("userlist", users);
chat.getUsers().forEach(users::add);
json.add(FIELD_USER_LIST, users);
}
return json;
}
private void addPropertyIfNotNull(JsonObject json, String key, String value) {
if (value != null) {
json.addProperty(key, value);
}
}
@Override
public WxCpChat deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject chatJson = json.getAsJsonObject();
WxCpChat chat = new WxCpChat();
chat.setId(GsonHelper.getAsString(chatJson.get("chatid")));
chat.setName(GsonHelper.getAsString(chatJson.get("name")));
chat.setOwner(GsonHelper.getAsString(chatJson.get("owner")));
JsonArray usersJson = chatJson.getAsJsonArray("userlist");
if (usersJson != null) {
if (usersJson != null && !usersJson.isEmpty()) {
List<String> users = new ArrayList<>(usersJson.size());
usersJson.forEach(e -> users.add(e.getAsString()));
chat.setUsers(users);
for (JsonElement userJson : usersJson) {
users.add(userJson.getAsString());
}
}
return chat;
}

View File

@ -1,11 +1,3 @@
/*
* KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved.
*
* This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended
* only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction
* arose from modification of the original source, or other redistribution of this source
* is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
*/
package me.chanjar.weixin.cp.util.json;
import com.google.gson.*;
@ -13,6 +5,8 @@ import me.chanjar.weixin.common.util.json.GsonHelper;
import me.chanjar.weixin.cp.bean.WxCpDepart;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Objects;
/**
* WxCpDepart的gson适配器.
@ -30,60 +24,47 @@ public class WxCpDepartGsonAdapter implements JsonSerializer<WxCpDepart>, JsonDe
@Override
public JsonElement serialize(WxCpDepart group, Type typeOfSrc, JsonSerializationContext context) {
JsonObject json = new JsonObject();
if (group.getId() != null) {
json.addProperty(ID, group.getId());
}
if (group.getName() != null) {
json.addProperty(NAME, group.getName());
}
if (group.getEnName() != null) {
json.addProperty(EN_NAME, group.getEnName());
}
if (group.getDepartmentLeader() != null) {
addPropertyIfNotNull(json, ID, group.getId());
addPropertyIfNotNull(json, NAME, group.getName());
addPropertyIfNotNull(json, EN_NAME, group.getEnName());
if (group.getDepartmentLeader() != null && group.getDepartmentLeader().length > 0) {
JsonArray jsonArray = new JsonArray();
for (String department : group.getDepartmentLeader()) {
jsonArray.add(new JsonPrimitive(department));
}
Arrays.stream(group.getDepartmentLeader()).filter(Objects::nonNull).forEach(jsonArray::add);
json.add(DEPARTMENT_LEADER, jsonArray);
}
if (group.getParentId() != null) {
json.addProperty(PARENT_ID, group.getParentId());
}
if (group.getOrder() != null) {
json.addProperty(ORDER, String.valueOf(group.getOrder()));
}
addPropertyIfNotNull(json, PARENT_ID, group.getParentId());
addPropertyIfNotNull(json, ORDER, group.getOrder());
return json;
}
private void addPropertyIfNotNull(JsonObject json, String key, Object value) {
if (value != null) {
if (value instanceof Number) {
json.addProperty(key, (Number) value);
} else {
json.addProperty(key, value.toString());
}
}
}
@Override
public WxCpDepart deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
WxCpDepart depart = new WxCpDepart();
JsonObject departJson = json.getAsJsonObject();
if (departJson.get(ID) != null && !departJson.get(ID).isJsonNull()) {
depart.setId(GsonHelper.getAsLong(departJson.get(ID)));
}
if (departJson.get(NAME) != null && !departJson.get(NAME).isJsonNull()) {
depart.setName(GsonHelper.getAsString(departJson.get(NAME)));
}
if (departJson.get(EN_NAME) != null && !departJson.get(EN_NAME).isJsonNull()) {
depart.setEnName(GsonHelper.getAsString(departJson.get(EN_NAME)));
}
if (departJson.getAsJsonArray(DEPARTMENT_LEADER) != null && !departJson.get(DEPARTMENT_LEADER).isJsonNull()) {
JsonArray jsonArray = departJson.getAsJsonArray(DEPARTMENT_LEADER);
depart.setId(GsonHelper.getAsLong(departJson.get(ID)));
depart.setName(GsonHelper.getAsString(departJson.get(NAME)));
depart.setEnName(GsonHelper.getAsString(departJson.get(EN_NAME)));
JsonArray jsonArray = departJson.getAsJsonArray(DEPARTMENT_LEADER);
if (jsonArray != null && !jsonArray.isJsonNull()) {
String[] departments = new String[jsonArray.size()];
int i = 0;
for (JsonElement jsonElement : jsonArray) {
departments[i++] = jsonElement.getAsString();
for (int i = 0; i < jsonArray.size(); i++) {
departments[i] = jsonArray.get(i).getAsString();
}
depart.setDepartmentLeader(departments);
}
if (departJson.get(ORDER) != null && !departJson.get(ORDER).isJsonNull()) {
depart.setOrder(GsonHelper.getAsLong(departJson.get(ORDER)));
}
if (departJson.get(PARENT_ID) != null && !departJson.get(PARENT_ID).isJsonNull()) {
depart.setParentId(GsonHelper.getAsLong(departJson.get(PARENT_ID)));
}
depart.setOrder(GsonHelper.getAsLong(departJson.get(ORDER)));
depart.setParentId(GsonHelper.getAsLong(departJson.get(PARENT_ID)));
return depart;
}

View File

@ -1,11 +1,3 @@
/*
* KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved.
*
* This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended
* only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction
* arose from modification of the original source, or other redistribution of this source
* is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
*/
package me.chanjar.weixin.cp.util.json;
import com.google.gson.*;
@ -21,19 +13,28 @@ import java.lang.reflect.Type;
*/
public class WxCpTagGsonAdapter implements JsonSerializer<WxCpTag>, JsonDeserializer<WxCpTag> {
private static final String TAG_ID = "tagid";
private static final String TAG_NAME = "tagname";
@Override
public JsonElement serialize(WxCpTag tag, Type typeOfSrc, JsonSerializationContext context) {
JsonObject o = new JsonObject();
o.addProperty("tagid", tag.getId());
o.addProperty("tagname", tag.getName());
addPropertyIfNotNull(o, TAG_ID, tag.getId());
addPropertyIfNotNull(o, TAG_NAME, tag.getName());
return o;
}
private void addPropertyIfNotNull(JsonObject obj, String key, String value) {
if (value != null) {
obj.addProperty(key, value);
}
}
@Override
public WxCpTag deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
return new WxCpTag(GsonHelper.getString(jsonObject, "tagid"), GsonHelper.getString(jsonObject, "tagname"));
return new WxCpTag(GsonHelper.getString(jsonObject, TAG_ID), GsonHelper.getString(jsonObject, TAG_NAME));
}
}

View File

@ -1,12 +1,3 @@
/*
* KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved.
*
* This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended
* only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction
* arose from modification of the original source, or other redistribution of this source
* is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD.
*/
package me.chanjar.weixin.cp.util.json;
import com.google.gson.*;
@ -15,6 +6,8 @@ import me.chanjar.weixin.cp.bean.Gender;
import me.chanjar.weixin.cp.bean.WxCpUser;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.stream.IntStream;
import static me.chanjar.weixin.cp.bean.WxCpUser.*;
@ -31,66 +24,78 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
private static final String DEPARTMENT = "department";
private static final String EXTERNAL_CORP_NAME = "external_corp_name";
private static final String WECHAT_CHANNELS = "wechat_channels";
private static final String ORDER = "order";
private static final String POSITIONS = "positions";
private static final String USER_ID = "userid";
private static final String NEW_USER_ID = "new_userid";
private static final String NAME = "name";
private static final String POSITION = "position";
private static final String MOBILE = "mobile";
private static final String GENDER = "gender";
private static final String EMAIL = "email";
private static final String BIZ_MAIL = "biz_mail";
private static final String AVATAR = "avatar";
private static final String THUMB_AVATAR = "thumb_avatar";
private static final String ADDRESS = "address";
private static final String AVATAR_MEDIAID = "avatar_mediaid";
private static final String STATUS = "status";
private static final String ENABLE = "enable";
private static final String ALIAS = "alias";
private static final String IS_LEADER = "isleader";
private static final String IS_LEADER_IN_DEPT = "is_leader_in_dept";
private static final String HIDE_MOBILE = "hide_mobile";
private static final String ENGLISH_NAME = "english_name";
private static final String TELEPHONE = "telephone";
private static final String QR_CODE = "qr_code";
private static final String TO_INVITE = "to_invite";
private static final String OPEN_USER_ID = "open_userid";
private static final String MAIN_DEPARTMENT = "main_department";
private static final String DIRECT_LEADER = "direct_leader";
private static final String TYPE = "type";
private static final String VALUE = "value";
private static final String TEXT = "text";
private static final String WEB = "web";
private static final String MINIPROGRAM = "miniprogram";
private static final String URL = "url";
private static final String TITLE = "title";
private static final String APPID = "appid";
private static final String PAGE_PATH = "pagepath";
private static final String ATTRS = "attrs";
private static final String NICKNAME = "nickname";
@Override
public WxCpUser deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject o = json.getAsJsonObject();
WxCpUser user = new WxCpUser();
if (o.get(DEPARTMENT) != null) {
JsonArray departJsonArray = o.get(DEPARTMENT).getAsJsonArray();
Long[] departIds = new Long[departJsonArray.size()];
int i = 0;
for (JsonElement jsonElement : departJsonArray) {
departIds[i++] = jsonElement.getAsLong();
}
user.setDepartIds(departIds);
}
user.setDepartIds(parseJsonArrayToLongArray(o, DEPARTMENT));
user.setOrders(parseJsonArrayToIntegerArray(o, ORDER));
user.setPositions(parseJsonArrayToStringArray(o, POSITIONS));
if (o.get("order") != null) {
JsonArray departJsonArray = o.get("order").getAsJsonArray();
Integer[] orders = new Integer[departJsonArray.size()];
int i = 0;
for (JsonElement jsonElement : departJsonArray) {
orders[i++] = jsonElement.getAsInt();
}
user.setOrders(orders);
}
if (o.get("positions") != null) {
JsonArray positionJsonArray = o.get("positions").getAsJsonArray();
String[] positions = new String[positionJsonArray.size()];
int i = 0;
for (JsonElement jsonElement : positionJsonArray) {
positions[i++] = jsonElement.getAsString();
}
user.setPositions(positions);
}
user.setUserId(GsonHelper.getString(o, "userid"));
user.setName(GsonHelper.getString(o, "name"));
user.setPosition(GsonHelper.getString(o, "position"));
user.setMobile(GsonHelper.getString(o, "mobile"));
user.setGender(Gender.fromCode(GsonHelper.getString(o, "gender")));
user.setEmail(GsonHelper.getString(o, "email"));
user.setBizMail(GsonHelper.getString(o, "biz_mail"));
user.setAvatar(GsonHelper.getString(o, "avatar"));
user.setThumbAvatar(GsonHelper.getString(o, "thumb_avatar"));
user.setAddress(GsonHelper.getString(o, "address"));
user.setAvatarMediaId(GsonHelper.getString(o, "avatar_mediaid"));
user.setStatus(GsonHelper.getInteger(o, "status"));
user.setEnable(GsonHelper.getInteger(o, "enable"));
user.setAlias(GsonHelper.getString(o, "alias"));
user.setIsLeader(GsonHelper.getInteger(o, "isleader"));
user.setIsLeaderInDept(GsonHelper.getIntArray(o, "is_leader_in_dept"));
user.setHideMobile(GsonHelper.getInteger(o, "hide_mobile"));
user.setEnglishName(GsonHelper.getString(o, "english_name"));
user.setTelephone(GsonHelper.getString(o, "telephone"));
user.setQrCode(GsonHelper.getString(o, "qr_code"));
user.setToInvite(GsonHelper.getBoolean(o, "to_invite"));
user.setOpenUserId(GsonHelper.getString(o, "open_userid"));
user.setMainDepartment(GsonHelper.getString(o, "main_department"));
user.setDirectLeader(GsonHelper.getStringArray(o, "direct_leader"));
user.setUserId(GsonHelper.getString(o, USER_ID));
user.setName(GsonHelper.getString(o, NAME));
user.setPosition(GsonHelper.getString(o, POSITION));
user.setMobile(GsonHelper.getString(o, MOBILE));
user.setGender(Gender.fromCode(GsonHelper.getString(o, GENDER)));
user.setEmail(GsonHelper.getString(o, EMAIL));
user.setBizMail(GsonHelper.getString(o, BIZ_MAIL));
user.setAvatar(GsonHelper.getString(o, AVATAR));
user.setThumbAvatar(GsonHelper.getString(o, THUMB_AVATAR));
user.setAddress(GsonHelper.getString(o, ADDRESS));
user.setAvatarMediaId(GsonHelper.getString(o, AVATAR_MEDIAID));
user.setStatus(GsonHelper.getInteger(o, STATUS));
user.setEnable(GsonHelper.getInteger(o, ENABLE));
user.setAlias(GsonHelper.getString(o, ALIAS));
user.setIsLeader(GsonHelper.getInteger(o, IS_LEADER));
user.setIsLeaderInDept(GsonHelper.getIntArray(o, IS_LEADER_IN_DEPT));
user.setHideMobile(GsonHelper.getInteger(o, HIDE_MOBILE));
user.setEnglishName(GsonHelper.getString(o, ENGLISH_NAME));
user.setTelephone(GsonHelper.getString(o, TELEPHONE));
user.setQrCode(GsonHelper.getString(o, QR_CODE));
user.setToInvite(GsonHelper.getBoolean(o, TO_INVITE));
user.setOpenUserId(GsonHelper.getString(o, OPEN_USER_ID));
user.setMainDepartment(GsonHelper.getString(o, MAIN_DEPARTMENT));
user.setDirectLeader(GsonHelper.getStringArray(o, DIRECT_LEADER));
if (GsonHelper.isNotNull(o.get(EXTRA_ATTR))) {
this.buildExtraAttrs(o, user);
@ -102,8 +107,9 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
JsonElement jsonElement = o.get(EXTERNAL_PROFILE).getAsJsonObject().get(WECHAT_CHANNELS);
if (jsonElement != null) {
JsonObject asJsonObject = jsonElement.getAsJsonObject();
user.setWechatChannels(WechatChannels.builder().nickname(GsonHelper.getString(asJsonObject, "nickname")).status(GsonHelper.getInteger(asJsonObject, "status")).build());
user.setWechatChannels(WechatChannels.builder().nickname(GsonHelper.getString(asJsonObject, NICKNAME)).status(GsonHelper.getInteger(asJsonObject, STATUS)).build());
}
this.buildExternalAttrs(o, user);
}
@ -112,33 +118,66 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
return user;
}
private Long[] parseJsonArrayToLongArray(JsonObject o, String key) {
JsonElement element = o.get(key);
if (element == null || !element.isJsonArray()) {
return null;
}
JsonArray jsonArray = element.getAsJsonArray();
return IntStream.range(0, jsonArray.size())
.mapToObj(i -> jsonArray.get(i).getAsLong())
.toArray(Long[]::new);
}
private Integer[] parseJsonArrayToIntegerArray(JsonObject o, String key) {
JsonElement element = o.get(key);
if (element == null || !element.isJsonArray()) {
return null;
}
JsonArray jsonArray = element.getAsJsonArray();
return IntStream.range(0, jsonArray.size())
.mapToObj(i -> jsonArray.get(i).getAsInt())
.toArray(Integer[]::new);
}
private String[] parseJsonArrayToStringArray(JsonObject o, String key) {
JsonElement element = o.get(key);
if (element == null || !element.isJsonArray()) {
return null;
}
JsonArray jsonArray = element.getAsJsonArray();
return IntStream.range(0, jsonArray.size())
.mapToObj(i -> jsonArray.get(i).getAsString())
.toArray(String[]::new);
}
private void buildExtraAttrs(JsonObject o, WxCpUser user) {
JsonArray attrJsonElements = o.get(EXTRA_ATTR).getAsJsonObject().get("attrs").getAsJsonArray();
JsonArray attrJsonElements = o.get(EXTRA_ATTR).getAsJsonObject().get(ATTRS).getAsJsonArray();
for (JsonElement attrJsonElement : attrJsonElements) {
final Integer type = GsonHelper.getInteger(attrJsonElement.getAsJsonObject(), "type");
final Integer type = GsonHelper.getInteger(attrJsonElement.getAsJsonObject(), TYPE);
final Attr attr = new Attr().setType(type)
.setName(GsonHelper.getString(attrJsonElement.getAsJsonObject(), "name"));
.setName(GsonHelper.getString(attrJsonElement.getAsJsonObject(), NAME));
user.getExtAttrs().add(attr);
if (type == null) {
attr.setTextValue(GsonHelper.getString(attrJsonElement.getAsJsonObject(), "value"));
attr.setTextValue(GsonHelper.getString(attrJsonElement.getAsJsonObject(), VALUE));
continue;
}
switch (type) {
case 0: {
JsonElement textJsonElement = attrJsonElement.getAsJsonObject().get("text");
JsonElement textJsonElement = attrJsonElement.getAsJsonObject().get(TEXT);
if (textJsonElement != null && !textJsonElement.isJsonNull() && textJsonElement.isJsonObject()) {
attr.setTextValue(GsonHelper.getString(textJsonElement.getAsJsonObject(), "value"));
attr.setTextValue(GsonHelper.getString(textJsonElement.getAsJsonObject(), VALUE));
} else {
attr.setTextValue(null); // Clear or set a default value to avoid stale data
}
break;
}
case 1: {
final JsonObject web = attrJsonElement.getAsJsonObject().get("web").getAsJsonObject();
attr.setWebTitle(GsonHelper.getString(web, "title"))
.setWebUrl(GsonHelper.getString(web, "url"));
final JsonObject web = attrJsonElement.getAsJsonObject().get(WEB).getAsJsonObject();
attr.setWebTitle(GsonHelper.getString(web, TITLE))
.setWebUrl(GsonHelper.getString(web, URL));
break;
}
default://ignored
@ -154,8 +193,8 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
JsonArray attrJsonElements = jsonElement.getAsJsonArray();
for (JsonElement element : attrJsonElements) {
final Integer type = GsonHelper.getInteger(element.getAsJsonObject(), "type");
final String name = GsonHelper.getString(element.getAsJsonObject(), "name");
final Integer type = GsonHelper.getInteger(element.getAsJsonObject(), TYPE);
final String name = GsonHelper.getString(element.getAsJsonObject(), NAME);
if (type == null) {
continue;
@ -167,32 +206,32 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
.add(ExternalAttribute.builder()
.type(type)
.name(name)
.value(GsonHelper.getString(element.getAsJsonObject().get("text").getAsJsonObject(), "value"))
.value(GsonHelper.getString(element.getAsJsonObject().get(TEXT).getAsJsonObject(), VALUE))
.build()
);
break;
}
case 1: {
final JsonObject web = element.getAsJsonObject().get("web").getAsJsonObject();
final JsonObject web = element.getAsJsonObject().get(WEB).getAsJsonObject();
user.getExternalAttrs()
.add(ExternalAttribute.builder()
.type(type)
.name(name)
.url(GsonHelper.getString(web, "url"))
.title(GsonHelper.getString(web, "title"))
.url(GsonHelper.getString(web, URL))
.title(GsonHelper.getString(web, TITLE))
.build()
);
break;
}
case 2: {
final JsonObject miniprogram = element.getAsJsonObject().get("miniprogram").getAsJsonObject();
final JsonObject miniprogram = element.getAsJsonObject().get(MINIPROGRAM).getAsJsonObject();
user.getExternalAttrs()
.add(ExternalAttribute.builder()
.type(type)
.name(name)
.appid(GsonHelper.getString(miniprogram, "appid"))
.pagePath(GsonHelper.getString(miniprogram, "pagepath"))
.title(GsonHelper.getString(miniprogram, "title"))
.appid(GsonHelper.getString(miniprogram, APPID))
.pagePath(GsonHelper.getString(miniprogram, PAGE_PATH))
.title(GsonHelper.getString(miniprogram, TITLE))
.build()
);
break;
@ -205,97 +244,70 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
@Override
public JsonElement serialize(WxCpUser user, Type typeOfSrc, JsonSerializationContext context) {
JsonObject o = new JsonObject();
this.addProperty(o, "userid", user.getUserId());
this.addProperty(o, "new_userid", user.getNewUserId());
this.addProperty(o, "name", user.getName());
if (user.getDepartIds() != null) {
JsonArray jsonArray = new JsonArray();
for (Long departId : user.getDepartIds()) {
jsonArray.add(new JsonPrimitive(departId));
}
o.add("department", jsonArray);
}
addProperty(o, USER_ID, user.getUserId());
addProperty(o, NEW_USER_ID, user.getNewUserId());
addProperty(o, NAME, user.getName());
if (user.getOrders() != null) {
JsonArray jsonArray = new JsonArray();
for (Integer order : user.getOrders()) {
jsonArray.add(new JsonPrimitive(order));
}
o.add("order", jsonArray);
}
addArrayProperty(o, DEPARTMENT, user.getDepartIds());
addArrayProperty(o, ORDER, user.getOrders());
addProperty(o, POSITION, user.getPosition());
addArrayProperty(o, POSITIONS, user.getPositions());
this.addProperty(o, "position", user.getPosition());
if (user.getPositions() != null) {
JsonArray jsonArray = new JsonArray();
for (String position : user.getPositions()) {
jsonArray.add(new JsonPrimitive(position));
}
o.add("positions", jsonArray);
}
this.addProperty(o, "mobile", user.getMobile());
addProperty(o, MOBILE, user.getMobile());
if (user.getGender() != null) {
o.addProperty("gender", user.getGender().getCode());
o.addProperty(GENDER, user.getGender().getCode());
}
this.addProperty(o, "email", user.getEmail());
this.addProperty(o, "biz_mail", user.getBizMail());
this.addProperty(o, "avatar", user.getAvatar());
this.addProperty(o, "thumb_avatar", user.getThumbAvatar());
this.addProperty(o, "address", user.getAddress());
this.addProperty(o, "avatar_mediaid", user.getAvatarMediaId());
this.addProperty(o, "status", user.getStatus());
this.addProperty(o, "enable", user.getEnable());
this.addProperty(o, "alias", user.getAlias());
this.addProperty(o, "isleader", user.getIsLeader());
addProperty(o, EMAIL, user.getEmail());
addProperty(o, BIZ_MAIL, user.getBizMail());
addProperty(o, AVATAR, user.getAvatar());
addProperty(o, THUMB_AVATAR, user.getThumbAvatar());
addProperty(o, ADDRESS, user.getAddress());
addProperty(o, AVATAR_MEDIAID, user.getAvatarMediaId());
addProperty(o, STATUS, user.getStatus());
addProperty(o, ENABLE, user.getEnable());
addProperty(o, ALIAS, user.getAlias());
addProperty(o, IS_LEADER, user.getIsLeader());
if (user.getIsLeaderInDept() != null && user.getIsLeaderInDept().length > 0) {
JsonArray ary = new JsonArray();
for (int item : user.getIsLeaderInDept()) {
ary.add(item);
}
o.add("is_leader_in_dept", ary);
Arrays.stream(user.getIsLeaderInDept()).forEach(ary::add);
o.add(IS_LEADER_IN_DEPT, ary);
}
this.addProperty(o, "hide_mobile", user.getHideMobile());
this.addProperty(o, "english_name", user.getEnglishName());
this.addProperty(o, "telephone", user.getTelephone());
this.addProperty(o, "qr_code", user.getQrCode());
addProperty(o, HIDE_MOBILE, user.getHideMobile());
addProperty(o, ENGLISH_NAME, user.getEnglishName());
addProperty(o, TELEPHONE, user.getTelephone());
addProperty(o, QR_CODE, user.getQrCode());
if (user.getToInvite() != null) {
o.addProperty("to_invite", user.getToInvite());
o.addProperty(TO_INVITE, user.getToInvite());
}
this.addProperty(o, "main_department", user.getMainDepartment());
addProperty(o, MAIN_DEPARTMENT, user.getMainDepartment());
addArrayProperty(o, DIRECT_LEADER, user.getDirectLeader());
if (user.getDirectLeader() != null && user.getDirectLeader().length > 0) {
JsonArray ary = new JsonArray();
for (String item : user.getDirectLeader()) {
ary.add(item);
}
o.add("direct_leader", ary);
}
if (!user.getExtAttrs().isEmpty()) {
JsonArray attrsJsonArray = new JsonArray();
for (Attr attr : user.getExtAttrs()) {
JsonObject attrJson = GsonHelper.buildJsonObject("type", attr.getType(),
"name", attr.getName());
JsonObject attrJson = GsonHelper.buildJsonObject(TYPE, attr.getType(),
NAME, attr.getName());
attrsJsonArray.add(attrJson);
if (attr.getType() == null) {
attrJson.addProperty("name", attr.getName());
attrJson.addProperty("value", attr.getTextValue());
attrJson.addProperty(NAME, attr.getName());
attrJson.addProperty(VALUE, attr.getTextValue());
continue;
}
switch (attr.getType()) {
case 0:
attrJson.add("text", GsonHelper.buildJsonObject("value", attr.getTextValue()));
attrJson.add(TEXT, GsonHelper.buildJsonObject(VALUE, attr.getTextValue()));
break;
case 1:
attrJson.add("web", GsonHelper.buildJsonObject("url", attr.getWebUrl(), "title", attr.getWebTitle()));
attrJson.add(WEB, GsonHelper.buildJsonObject(URL, attr.getWebUrl(), TITLE, attr.getWebTitle()));
break;
default: //ignored
}
}
JsonObject attrsJson = new JsonObject();
attrsJson.add("attrs", attrsJsonArray);
attrsJson.add(ATTRS, attrsJsonArray);
o.add(EXTRA_ATTR, attrsJson);
}
@ -307,15 +319,15 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
this.addProperty(attrsJson, EXTERNAL_CORP_NAME, user.getExternalCorpName());
if (user.getWechatChannels() != null) {
attrsJson.add(WECHAT_CHANNELS, GsonHelper.buildJsonObject("nickname", user.getWechatChannels().getNickname(),
"status", user.getWechatChannels().getStatus()));
attrsJson.add(WECHAT_CHANNELS, GsonHelper.buildJsonObject(NICKNAME, user.getWechatChannels().getNickname(),
STATUS, user.getWechatChannels().getStatus()));
}
if (!user.getExternalAttrs().isEmpty()) {
JsonArray attrsJsonArray = new JsonArray();
for (ExternalAttribute attr : user.getExternalAttrs()) {
JsonObject attrJson = GsonHelper.buildJsonObject("type", attr.getType(),
"name", attr.getName());
JsonObject attrJson = GsonHelper.buildJsonObject(TYPE, attr.getType(),
NAME, attr.getName());
attrsJsonArray.add(attrJson);
@ -325,14 +337,14 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
switch (attr.getType()) {
case 0:
attrJson.add("text", GsonHelper.buildJsonObject("value", attr.getValue()));
attrJson.add(TEXT, GsonHelper.buildJsonObject(VALUE, attr.getValue()));
break;
case 1:
attrJson.add("web", GsonHelper.buildJsonObject("url", attr.getUrl(), "title", attr.getTitle()));
attrJson.add(WEB, GsonHelper.buildJsonObject(URL, attr.getUrl(), TITLE, attr.getTitle()));
break;
case 2:
attrJson.add("miniprogram", GsonHelper.buildJsonObject("appid", attr.getAppid(),
"pagepath", attr.getPagePath(), "title", attr.getTitle()));
attrJson.add(MINIPROGRAM, GsonHelper.buildJsonObject(APPID, attr.getAppid(),
PAGE_PATH, attr.getPagePath(), TITLE, attr.getTitle()));
break;
default://忽略
}
@ -344,15 +356,29 @@ public class WxCpUserGsonAdapter implements JsonDeserializer<WxCpUser>, JsonSeri
return o;
}
private void addProperty(JsonObject object, String property, Integer value) {
if (value != null) {
object.addProperty(property, value);
private void addArrayProperty(JsonObject o, String key, Object[] array) {
if (array != null && array.length > 0) {
JsonArray jsonArray = new JsonArray();
Arrays.stream(array).forEach(item -> {
if (item instanceof Number) {
jsonArray.add((Number) item);
} else {
jsonArray.add(item.toString());
}
});
o.add(key, jsonArray);
}
}
private void addProperty(JsonObject object, String property, String value) {
private void addProperty(JsonObject object, String property, Object value) {
if (value != null) {
object.addProperty(property, value);
if (value instanceof Number) {
object.addProperty(property, (Number) value);
} else if (value instanceof Boolean) {
object.addProperty(property, (Boolean) value);
} else {
object.addProperty(property, value.toString());
}
}
}