From 07352d183c02eee35935321bd56fc61ee90ecdf8 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 4 Sep 2020 21:46:57 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20#1738=20=E4=BF=AE=E5=A4=8D=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E5=88=9B=E5=BB=BA=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=87=AA=E5=AE=9A=E4=B9=89=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E7=BC=BA=E5=A4=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 +- weixin-java-common/pom.xml | 2 +- .../weixin/common/util/json/GsonHelper.java | 47 ++++++ .../common/util/json/GsonHelperTest.java | 139 ++++++++++++++++++ .../me/chanjar/weixin/cp/bean/WxCpUser.java | 3 + .../cp/util/json/WxCpUserGsonAdapter.java | 53 +++---- .../cp/util/json/WxCpUserGsonAdapterTest.java | 12 +- 7 files changed, 219 insertions(+), 41 deletions(-) create mode 100644 weixin-java-common/src/test/java/me/chanjar/weixin/common/util/json/GsonHelperTest.java 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\"," +