diff --git a/pom.xml b/pom.xml
index 379f5cf45..99dc1146d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -172,7 +172,7 @@
org.slf4j
slf4j-api
- 1.7.24
+ 1.7.30
com.thoughtworks.xstream
@@ -268,7 +268,7 @@
org.springframework.data
spring-data-redis
- 1.8.23.RELEASE
+ 2.3.3.RELEASE
true
provided
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index 8786e0458..a94e4f60e 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -50,7 +50,7 @@
org.slf4j
jcl-over-slf4j
- 1.7.24
+ 1.7.30
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java
index 882853945..11a0742a7 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonHelper.java
@@ -4,6 +4,7 @@ import com.google.common.collect.Lists;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
+import jodd.util.MathUtil;
import java.util.List;
@@ -151,4 +152,50 @@ public class GsonHelper {
public static JsonArray getAsJsonArray(JsonElement element) {
return element == null ? null : element.getAsJsonArray();
}
+
+ /**
+ * 快速构建JsonObject对象,批量添加一堆属性
+ *
+ * @param keyOrValue 包含key或value的数组
+ * @return JsonObject对象.
+ */
+ public static JsonObject buildJsonObject(Object... keyOrValue) {
+ JsonObject result = new JsonObject();
+ put(result, keyOrValue);
+ return result;
+ }
+
+ /**
+ * 批量向JsonObject对象中添加属性
+ *
+ * @param jsonObject 原始JsonObject对象
+ * @param keyOrValue 包含key或value的数组
+ */
+ public static void put(JsonObject jsonObject, Object... keyOrValue) {
+ if (MathUtil.isOdd(keyOrValue.length)) {
+ throw new RuntimeException("参数个数必须为偶数");
+ }
+
+ for (int i = 0; i < keyOrValue.length / 2; i++) {
+ final Object key = keyOrValue[2 * i];
+ final Object value = keyOrValue[2 * i + 1];
+ if (value == null) {
+ jsonObject.add(key.toString(), null);
+ continue;
+ }
+
+ if (value instanceof Boolean) {
+ jsonObject.addProperty(key.toString(), (Boolean) value);
+ } else if (value instanceof Character) {
+ jsonObject.addProperty(key.toString(), (Character) value);
+ } else if (value instanceof Number) {
+ jsonObject.addProperty(key.toString(), (Number) value);
+ } else if (value instanceof JsonElement) {
+ jsonObject.add(key.toString(), (JsonElement) value);
+ } else {
+ jsonObject.addProperty(key.toString(), value.toString());
+ }
+ }
+
+ }
}
diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/json/GsonHelperTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/json/GsonHelperTest.java
new file mode 100644
index 000000000..396862e70
--- /dev/null
+++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/json/GsonHelperTest.java
@@ -0,0 +1,139 @@
+package me.chanjar.weixin.common.util.json;
+
+import com.google.gson.JsonObject;
+import org.testng.annotations.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * GsonHelper 的单元测试.
+ *
+ * @author Binary Wang
+ * @date 2020-09-04
+ */
+public class GsonHelperTest {
+
+ @Test
+ public void testIsNull() {
+ }
+
+ @Test
+ public void testIsNotNull() {
+ }
+
+ @Test
+ public void testGetLong() {
+ }
+
+ @Test
+ public void testGetPrimitiveLong() {
+ }
+
+ @Test
+ public void testGetInteger() {
+ }
+
+ @Test
+ public void testGetPrimitiveInteger() {
+ }
+
+ @Test
+ public void testGetDouble() {
+ }
+
+ @Test
+ public void testGetPrimitiveDouble() {
+ }
+
+ @Test
+ public void testGetFloat() {
+ }
+
+ @Test
+ public void testGetPrimitiveFloat() {
+ }
+
+ @Test
+ public void testGetBoolean() {
+ }
+
+ @Test
+ public void testGetString() {
+ }
+
+ @Test
+ public void testGetAsString() {
+ }
+
+ @Test
+ public void testGetAsLong() {
+ }
+
+ @Test
+ public void testGetAsPrimitiveLong() {
+ }
+
+ @Test
+ public void testGetAsInteger() {
+ }
+
+ @Test
+ public void testGetAsPrimitiveInt() {
+ }
+
+ @Test
+ public void testGetAsBoolean() {
+ }
+
+ @Test
+ public void testGetAsPrimitiveBool() {
+ }
+
+ @Test
+ public void testGetAsDouble() {
+ }
+
+ @Test
+ public void testGetAsPrimitiveDouble() {
+ }
+
+ @Test
+ public void testGetAsFloat() {
+ }
+
+ @Test
+ public void testGetAsPrimitiveFloat() {
+ }
+
+ @Test
+ public void testGetIntArray() {
+ }
+
+ @Test
+ public void testGetStringArray() {
+ }
+
+ @Test
+ public void testGetLongArray() {
+ }
+
+ @Test
+ public void testGetAsJsonArray() {
+ }
+
+ @Test
+ public void testBuildSimpleJsonObject() {
+ try {
+ GsonHelper.buildJsonObject(1, 2, 3);
+ } catch (RuntimeException e) {
+ assertThat(e.getMessage()).isEqualTo("参数个数必须为偶数");
+ }
+
+ System.out.println(GsonHelper.buildJsonObject(1, 2));
+ System.out.println(GsonHelper.buildJsonObject(1, null));
+ System.out.println(GsonHelper.buildJsonObject("int", 1, "float", 2.1f, "double", 2.5));
+ System.out.println(GsonHelper.buildJsonObject("boolean", true, "string", "1av"));
+ System.out.println(GsonHelper.buildJsonObject(1, true, "jsonElement", new JsonObject()));
+ System.out.println(GsonHelper.buildJsonObject("num", 2, "string", "cde", "char", 'a', "bool", true));
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java
index a6ceb4e55..221f49aa8 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java
@@ -86,6 +86,9 @@ public class WxCpUser implements Serializable {
@Data
@Accessors(chain = true)
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
public static class Attr {
/**
* 属性类型: 0-文本 1-网页
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 e721b33ac..5ec9d1482 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
@@ -276,11 +276,11 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri
o.addProperty("main_department", user.getMainDepartment());
}
- if (user.getExtAttrs().size() > 0) {
+ if (!user.getExtAttrs().isEmpty()) {
JsonArray attrsJsonArray = new JsonArray();
for (WxCpUser.Attr attr : user.getExtAttrs()) {
- JsonObject attrJson = new JsonObject();
-
+ JsonObject attrJson = GsonHelper.buildJsonObject("type", attr.getType(),
+ "name", attr.getName());
attrsJsonArray.add(attrJson);
if (attr.getType() == null) {
@@ -290,19 +290,12 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri
}
switch (attr.getType()) {
- case 0: {
- JsonObject text = new JsonObject();
- text.addProperty("value", attr.getTextValue());
- attrJson.add("text", text);
+ case 0:
+ attrJson.add("text", GsonHelper.buildJsonObject("value", attr.getTextValue()));
break;
- }
- case 1: {
- JsonObject web = new JsonObject();
- web.addProperty("url", attr.getWebUrl());
- web.addProperty("title", attr.getWebTitle());
- attrJson.add("web", web);
+ case 1:
+ attrJson.add("web", GsonHelper.buildJsonObject("url", attr.getWebUrl(), "title", attr.getWebTitle()));
break;
- }
default: //ignored
}
}
@@ -322,12 +315,11 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri
attrsJson.addProperty(EXTERNAL_CORP_NAME, user.getExternalCorpName());
}
- if (user.getExternalAttrs().size() > 0) {
+ if (!user.getExternalAttrs().isEmpty()) {
JsonArray attrsJsonArray = new JsonArray();
for (WxCpUser.ExternalAttribute attr : user.getExternalAttrs()) {
- JsonObject attrJson = new JsonObject();
- attrJson.addProperty("type", attr.getType());
- attrJson.addProperty("name", attr.getName());
+ JsonObject attrJson = GsonHelper.buildJsonObject("type", attr.getType(),
+ "name", attr.getName());
attrsJsonArray.add(attrJson);
@@ -336,27 +328,16 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri
}
switch (attr.getType()) {
- case 0: {
- JsonObject text = new JsonObject();
- text.addProperty("value", attr.getValue());
- attrJson.add("text", text);
+ case 0:
+ attrJson.add("text", GsonHelper.buildJsonObject("value", attr.getValue()));
break;
- }
- case 1: {
- JsonObject web = new JsonObject();
- web.addProperty("url", attr.getUrl());
- web.addProperty("title", attr.getTitle());
- attrJson.add("web", web);
+ case 1:
+ attrJson.add("web", GsonHelper.buildJsonObject("url", attr.getUrl(), "title", attr.getTitle()));
break;
- }
- case 2: {
- JsonObject miniprogram = new JsonObject();
- miniprogram.addProperty("appid", attr.getAppid());
- miniprogram.addProperty("pagepath", attr.getPagePath());
- miniprogram.addProperty("title", attr.getTitle());
- attrJson.add("miniprogram", miniprogram);
+ case 2:
+ attrJson.add("miniprogram", GsonHelper.buildJsonObject("appid", attr.getAppid(),
+ "pagepath", attr.getPagePath(), "title", attr.getTitle()));
break;
- }
default://忽略
}
}
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 d78175c1b..a83e8837d 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
@@ -91,7 +91,7 @@ public class WxCpUserGsonAdapterTest {
assertThat(user).isNotNull();
assertThat(user.getOrders()).isNotEmpty();
- assertThat(user.getOrders().length).isEqualTo(2);
+ assertThat(user.getOrders()).hasSize(2);
assertThat(user.getOrders()[0]).isEqualTo(1);
assertThat(user.getOrders()[1]).isEqualTo(2);
@@ -140,6 +140,12 @@ public class WxCpUserGsonAdapterTest {
public void testSerialize() {
WxCpUser user = new WxCpUser();
user.setOrders(new Integer[]{1, 2});
+ user.addExtAttr(WxCpUser.Attr.builder()
+ .type(0)
+ .name("文本名称")
+ .textValue("文本")
+ .build());
+
user.addExternalAttr(WxCpUser.ExternalAttribute.builder()
.type(0)
.name("文本名称")
@@ -159,7 +165,9 @@ public class WxCpUserGsonAdapterTest {
.title("my miniprogram")
.build());
- assertThat(user.toJson()).isEqualTo("{\"order\":[1,2],\"external_profile\":{\"external_attr\":" +
+ assertThat(user.toJson()).isEqualTo("{\"order\":[1,2]," +
+ "\"extattr\":{\"attrs\":[{\"type\":0,\"name\":\"文本名称\",\"text\":{\"value\":\"文本\"}}]}," +
+ "\"external_profile\":{\"external_attr\":" +
"[{\"type\":0,\"name\":\"文本名称\",\"text\":{\"value\":\"文本\"}}," +
"{\"type\":1,\"name\":\"网页名称\",\"web\":{\"url\":\"http://www.test.com\",\"title\":\"标题\"}}," +
"{\"type\":2,\"name\":\"测试app\"," +