From 0adca9650d872388a913699e95ab3ab2fe214215 Mon Sep 17 00:00:00 2001 From: niefy <34568539+niefy@users.noreply.github.com> Date: Mon, 6 Jul 2020 17:01:37 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20#1659=20Json=E8=A7=A3=E6=9E=90=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 解决动态添加第一个公众号时由于configStorageMap为null报空指针异常 * Json解析统一优化 Co-authored-by: niefy --- .../binarywang/wx/graal/GraalProcessor.java | 1 - .../ApacheSimpleGetRequestExecutor.java | 1 - .../ApacheSimplePostRequestExecutor.java | 2 -- .../JoddHttpSimpleGetRequestExecutor.java | 1 - .../OkHttpSimpleGetRequestExecutor.java | 1 - .../weixin/common/util/json/GsonParser.java | 23 +++++++++++++++ ...WxMessageInMemoryDuplicateCheckerTest.java | 1 - .../cp/api/WxCpExternalContactService.java | 1 - .../cp/api/impl/BaseWxCpServiceImpl.java | 11 ++++--- .../cp/api/impl/BaseWxCpTpServiceImpl.java | 4 +-- .../cp/api/impl/WxCpAgentServiceImpl.java | 8 ++--- .../cp/api/impl/WxCpChatServiceImpl.java | 9 +++--- .../api/impl/WxCpDepartmentServiceImpl.java | 13 ++++----- .../cp/api/impl/WxCpMediaServiceImpl.java | 2 -- .../cp/api/impl/WxCpMenuServiceImpl.java | 1 - .../cp/api/impl/WxCpOAuth2ServiceImpl.java | 11 ++----- .../weixin/cp/api/impl/WxCpOaServiceImpl.java | 14 ++++----- .../weixin/cp/api/impl/WxCpServiceImpl.java | 6 ++-- .../cp/api/impl/WxCpTagServiceImpl.java | 13 +++++---- .../cp/api/impl/WxCpTaskCardServiceImpl.java | 1 - .../WxCpTpServiceApacheHttpClientImpl.java | 4 +-- .../cp/api/impl/WxCpUserServiceImpl.java | 27 ++++++++--------- .../weixin/cp/bean/WxCpInviteResult.java | 5 ---- .../weixin/cp/bean/WxCpTpXmlMessage.java | 9 ------ .../weixin/cp/bean/WxCpTpXmlPackage.java | 7 ----- .../cp/bean/WxCpUserExternalUnassignList.java | 1 - .../weixin/cp/bean/oa/WxCpTemplateResult.java | 3 -- .../oa/templatedata/TemplateControls.java | 1 - .../control/TemplateAttendance.java | 1 - .../cp/api/impl/BaseWxCpServiceImplTest.java | 1 - .../api/impl/BaseWxCpTpServiceImplTest.java | 4 --- .../cp/api/impl/WxCpAgentServiceImplTest.java | 2 -- .../cp/api/impl/WxCpUserServiceImplTest.java | 1 - .../weixin/cp/bean/WxCpTpXmlPackageTest.java | 1 - .../weixin/cp/demo/WxCpOAuth2Servlet.java | 1 - .../miniapp/api/impl/BaseWxMaServiceImpl.java | 6 ++-- .../api/impl/WxMaAnalysisServiceImpl.java | 6 ++-- .../api/impl/WxMaCloudServiceImpl.java | 29 +++++++++---------- .../miniapp/api/impl/WxMaCodeServiceImpl.java | 10 +++---- .../api/impl/WxMaJsapiServiceImpl.java | 11 +++---- .../api/impl/WxMaLiveGoodsServiceImpl.java | 16 +++++----- .../miniapp/api/impl/WxMaLiveServiceImpl.java | 11 ++++--- .../miniapp/api/impl/WxMaMsgServiceImpl.java | 12 ++++---- .../api/impl/WxMaSubscribeServiceImpl.java | 10 +++---- .../wx/miniapp/bean/WxMaRunStepInfo.java | 6 ++-- .../WxCloudDatabaseCreateIndexRequest.java | 1 - .../bean/express/WxMaExpressAccount.java | 6 ++-- .../bean/express/WxMaExpressDelivery.java | 6 ++-- .../bean/express/WxMaExpressPrinter.java | 3 +- .../result/WxMaExpressOrderInfoResult.java | 6 ++-- .../WxMaPubTemplateTitleListResult.java | 2 -- .../bean/template/WxMaTemplateAddResult.java | 2 -- .../WxMaTemplateLibraryListResult.java | 2 -- .../api/impl/WxMaMsgServiceImplTest.java | 3 -- .../api/impl/WxMaShareServiceImplTest.java | 6 ---- .../wx/miniapp/bean/WxMaRunStepInfoTest.java | 1 - .../impl/WxMaRedissonConfigImplTest.java | 2 -- .../message/WxMaXmlOutMessageTest.java | 1 - .../WxMaUniformMessageGsonAdapterTest.java | 10 +++---- .../mp/api/impl/BaseWxMpServiceImpl.java | 20 +++++++------ .../mp/api/impl/WxMpAiOpenServiceImpl.java | 8 ++--- .../mp/api/impl/WxMpCardServiceImpl.java | 9 +++--- .../mp/api/impl/WxMpDeviceServiceImpl.java | 1 - .../mp/api/impl/WxMpMarketingServiceImpl.java | 7 ++--- .../api/impl/WxMpMassMessageServiceImpl.java | 1 - .../mp/api/impl/WxMpMaterialServiceImpl.java | 1 - .../mp/api/impl/WxMpMenuServiceImpl.java | 9 +++--- .../mp/api/impl/WxMpStoreServiceImpl.java | 6 ++-- .../api/impl/WxMpTemplateMsgServiceImpl.java | 9 +++--- .../impl/WxMpUserBlacklistServiceImpl.java | 1 - .../mp/api/impl/WxMpUserServiceImpl.java | 1 - .../mp/api/impl/WxMpUserTagServiceImpl.java | 4 +-- .../me/chanjar/weixin/mp/bean/card/Card.java | 1 - .../weixin/mp/bean/card/DiscountCard.java | 1 - .../chanjar/weixin/mp/bean/card/GiftCard.java | 1 - .../card/WxMpCardMpnewsGethtmlResult.java | 1 - .../mp/bean/comment/WxMpCommentListVo.java | 2 -- .../datacube/WxDataCubeArticleResult.java | 3 +- .../bean/datacube/WxDataCubeArticleTotal.java | 3 +- .../bean/datacube/WxDataCubeBaseResult.java | 2 -- .../datacube/WxDataCubeInterfaceResult.java | 3 +- .../mp/bean/datacube/WxDataCubeMsgResult.java | 3 +- .../bean/datacube/WxDataCubeUserCumulate.java | 7 ++--- .../bean/datacube/WxDataCubeUserSummary.java | 7 ++--- .../mp/bean/kefu/result/WxMpKfOnlineList.java | 1 - .../kefu/result/WxMpKfSessionGetResult.java | 1 - .../mp/bean/marketing/WxMpAdLeadResult.java | 5 ++-- .../mp/bean/marketing/WxMpUserActionSet.java | 5 ++-- .../chanjar/weixin/mp/bean/tag/WxUserTag.java | 6 ++-- .../weixin/mp/bean/template/WxMpTemplate.java | 6 ++-- .../mp/bean/wifi/WxMpWifiShopDataResult.java | 6 ++-- .../mp/bean/wifi/WxMpWifiShopListResult.java | 4 +-- .../weixin/mp/util/crypto/WxMpCryptUtil.java | 1 - .../impl/WxMpMarketingServiceImplTest.java | 2 -- .../mp/api/impl/WxMpUserServiceImplTest.java | 1 - .../WxMpMemberCardUpdateResultTest.java | 1 - .../menu/WxMpGetSelfMenuInfoResultTest.java | 1 - .../api/impl/WxOpenComponentServiceImpl.java | 8 ++--- .../weixin/open/bean/WxOpenCreateResult.java | 1 - .../open/bean/ma/WxOpenMaPreviewInfo.java | 2 -- .../MaQrCodeOkhttpRequestExecutor.java | 2 -- .../weixin/open/util/WxOpenCryptUtil.java | 1 - .../impl/WxOpenComponentServiceImplTest.java | 2 -- .../wxpay/bean/entpay/EntPayRequest.java | 1 - .../ProfitSharingFinishRequest.java | 1 - .../bean/result/WxPayRefundQueryResult.java | 8 ++--- .../wxpay/bean/result/WxPayRefundResult.java | 8 ++--- .../wxpay/service/PayScoreService.java | 2 -- .../impl/ProfitSharingServiceImpl.java | 2 -- .../impl/WxPayServiceApacheHttpImpl.java | 7 ++--- .../wxpay/v3/auth/WxPayCredentials.java | 2 -- .../wxpay/v3/auth/WxPayValidator.java | 3 +- .../wxpay/bean/entpay/EntPayRequestTest.java | 2 -- .../impl/ProfitSharingServiceImplTest.java | 3 -- 114 files changed, 229 insertions(+), 337 deletions(-) create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonParser.java diff --git a/weixin-graal/src/main/java/cn/binarywang/wx/graal/GraalProcessor.java b/weixin-graal/src/main/java/cn/binarywang/wx/graal/GraalProcessor.java index 4eaddadf2..a7b02cae9 100644 --- a/weixin-graal/src/main/java/cn/binarywang/wx/graal/GraalProcessor.java +++ b/weixin-graal/src/main/java/cn/binarywang/wx/graal/GraalProcessor.java @@ -1,7 +1,6 @@ package cn.binarywang.wx.graal; import lombok.Data; -import lombok.extern.slf4j.Slf4j; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimpleGetRequestExecutor.java index 32299f56f..2c536c424 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimpleGetRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimpleGetRequestExecutor.java @@ -1,7 +1,6 @@ package me.chanjar.weixin.common.util.http.apache; import me.chanjar.weixin.common.WxType; -import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java index 598278c78..493295bc9 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java @@ -1,7 +1,6 @@ package me.chanjar.weixin.common.util.http.apache; import me.chanjar.weixin.common.WxType; -import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; @@ -12,7 +11,6 @@ import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; -import org.jetbrains.annotations.NotNull; import java.io.IOException; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java index 193787a6b..c549967e1 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java @@ -6,7 +6,6 @@ import jodd.http.HttpResponse; import jodd.http.ProxyInfo; import jodd.util.StringPool; import me.chanjar.weixin.common.WxType; -import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java index 09012692f..4447bb268 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java @@ -1,7 +1,6 @@ package me.chanjar.weixin.common.util.http.okhttp; import me.chanjar.weixin.common.WxType; -import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonParser.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonParser.java new file mode 100644 index 000000000..494e75a9e --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/GsonParser.java @@ -0,0 +1,23 @@ +package me.chanjar.weixin.common.util.json; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.stream.JsonReader; + +import java.io.Reader; + +public class GsonParser { + private static final JsonParser JSON_PARSER = new JsonParser(); + + public static JsonObject parse(String json){ + return JSON_PARSER.parse(json).getAsJsonObject(); + } + + public static JsonObject parse(Reader json){ + return JSON_PARSER.parse(json).getAsJsonObject(); + } + + public static JsonObject parse(JsonReader json){ + return JSON_PARSER.parse(json).getAsJsonObject(); + } +} diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerTest.java index 6f98b3d98..fd8819272 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerTest.java @@ -1,6 +1,5 @@ package me.chanjar.weixin.common.api; -import org.testng.Assert; import org.testng.annotations.Test; import java.util.concurrent.TimeUnit; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java index 5aa2336a7..94de03e55 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java @@ -3,7 +3,6 @@ package me.chanjar.weixin.cp.api; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.cp.bean.*; -import java.util.Calendar; import java.util.Date; import java.util.List; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java index 9dd1333bf..416d128d5 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java @@ -2,9 +2,7 @@ package me.chanjar.weixin.cp.api.impl; import com.google.common.base.Joiner; import com.google.gson.JsonArray; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.bean.WxJsapiSignature; @@ -20,6 +18,7 @@ import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.*; import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult; import me.chanjar.weixin.cp.bean.WxCpMessage; @@ -110,7 +109,7 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH synchronized (this.globalAgentJsapiTicketRefreshLock) { if (this.configStorage.isAgentJsapiTicketExpired()) { String responseContent = this.get(this.configStorage.getApiUrl(GET_AGENT_CONFIG_TICKET), null); - JsonObject jsonObject = new JsonParser().parse(responseContent).getAsJsonObject(); + JsonObject jsonObject = GsonParser.parse(responseContent); this.configStorage.updateAgentJsapiTicket(jsonObject.get("ticket").getAsString(), jsonObject.get("expires_in").getAsInt()); } @@ -135,7 +134,7 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH synchronized (this.globalJsapiTicketRefreshLock) { if (this.configStorage.isJsapiTicketExpired()) { String responseContent = this.get(this.configStorage.getApiUrl(GET_JSAPI_TICKET), null); - JsonObject tmpJsonObject = new JsonParser().parse(responseContent).getAsJsonObject(); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); this.configStorage.updateJsapiTicket(tmpJsonObject.get("ticket").getAsString(), tmpJsonObject.get("expires_in").getAsInt()); } @@ -191,8 +190,8 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH @Override public String[] getCallbackIp() throws WxErrorException { String responseContent = get(this.configStorage.getApiUrl(GET_CALLBACK_IP), null); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - JsonArray jsonArray = tmpJsonElement.getAsJsonObject().get("ip_list").getAsJsonArray(); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); + JsonArray jsonArray = tmpJsonObject.get("ip_list").getAsJsonArray(); String[] ips = new String[jsonArray.size()]; for (int i = 0; i < jsonArray.size(); i++) { ips[i] = jsonArray.get(i).getAsString(); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java index dea647f3f..2f5872b04 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java @@ -2,7 +2,6 @@ package me.chanjar.weixin.cp.api.impl; import com.google.common.base.Joiner; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.WxType; @@ -15,6 +14,7 @@ import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.common.util.http.RequestHttp; import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpTpService; import me.chanjar.weixin.cp.bean.*; import me.chanjar.weixin.cp.config.WxCpTpConfigStorage; @@ -119,7 +119,7 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ jsonObject.addProperty("auth_code", authCode); String result = post(configStorage.getApiUrl(GET_PERMANENT_CODE), jsonObject.toString()); - jsonObject = new JsonParser().parse(result).getAsJsonObject(); + jsonObject = GsonParser.parse(result); WxCpTpCorp wxCpTpCorp = WxCpTpCorp.fromJson(jsonObject.get("auth_corp_info").getAsJsonObject().toString()); wxCpTpCorp.setPermanentCode(jsonObject.get("permanent_code").getAsString()); return wxCpTpCorp; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java index 94aa977b2..d294c508f 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java @@ -1,12 +1,12 @@ package me.chanjar.weixin.cp.api.impl; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpAgentService; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.WxCpAgent; @@ -27,7 +27,7 @@ import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Agent.*; */ @RequiredArgsConstructor public class WxCpAgentServiceImpl implements WxCpAgentService { - private static final JsonParser JSON_PARSER = new JsonParser(); + private final WxCpService mainService; @@ -45,7 +45,7 @@ public class WxCpAgentServiceImpl implements WxCpAgentService { public void set(WxCpAgent agentInfo) throws WxErrorException { String url = this.mainService.getWxCpConfigStorage().getApiUrl(AGENT_SET); String responseContent = this.mainService.post(url, agentInfo.toJson()); - JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + JsonObject jsonObject = GsonParser.parse(responseContent); if (jsonObject.get("errcode").getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.CP)); } @@ -55,7 +55,7 @@ public class WxCpAgentServiceImpl implements WxCpAgentService { public List list() throws WxErrorException { String url = this.mainService.getWxCpConfigStorage().getApiUrl(AGENT_LIST); String responseContent = this.mainService.get(url, null); - JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + JsonObject jsonObject = GsonParser.parse(responseContent); if (jsonObject.get("errcode").getAsInt() != 0) { throw new WxErrorException(WxError.fromJson(responseContent, WxType.CP)); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java index b1f374c07..db85d2f25 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java @@ -1,14 +1,13 @@ package me.chanjar.weixin.cp.api.impl; -import com.google.gson.JsonParser; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.cp.api.WxCpChatService; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.WxCpAppChatMessage; import me.chanjar.weixin.cp.bean.WxCpChat; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import org.apache.commons.lang3.StringUtils; @@ -25,7 +24,7 @@ import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Chat.*; */ @RequiredArgsConstructor public class WxCpChatServiceImpl implements WxCpChatService { - private static final JsonParser JSON_PARSER = new JsonParser(); + private final WxCpService cpService; @Override @@ -45,7 +44,7 @@ public class WxCpChatServiceImpl implements WxCpChatService { } final String url = this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_CREATE); String result = this.cpService.post(url, WxGsonBuilder.create().toJson(data)); - return new JsonParser().parse(result).getAsJsonObject().get("chatid").getAsString(); + return GsonParser.parse(result).get("chatid").getAsString(); } @Override @@ -87,7 +86,7 @@ public class WxCpChatServiceImpl implements WxCpChatService { public WxCpChat chatGet(String chatId) throws WxErrorException { final String url = this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_GET_CHATID + chatId); String result = this.cpService.get(url, null); - final String chatInfo = JSON_PARSER.parse(result).getAsJsonObject().getAsJsonObject("chat_info").toString(); + final String chatInfo = GsonParser.parse(result).getAsJsonObject("chat_info").toString(); return WxCpGsonBuilder.create().fromJson(chatInfo, WxCpChat.class); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java index fb2224e33..3a5ef8798 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java @@ -1,15 +1,14 @@ package me.chanjar.weixin.cp.api.impl; -import com.google.gson.JsonElement; -import com.google.gson.JsonParser; +import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.json.GsonHelper; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpDepartmentService; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.WxCpDepart; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import java.util.List; @@ -32,8 +31,8 @@ public class WxCpDepartmentServiceImpl implements WxCpDepartmentService { public Long create(WxCpDepart depart) throws WxErrorException { String url = this.mainService.getWxCpConfigStorage().getApiUrl(DEPARTMENT_CREATE); String responseContent = this.mainService.post(url, depart.toJson()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return GsonHelper.getAsLong(tmpJsonElement.getAsJsonObject().get("id")); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); + return GsonHelper.getAsLong(tmpJsonObject.get("id")); } @Override @@ -56,9 +55,9 @@ public class WxCpDepartmentServiceImpl implements WxCpDepartmentService { } String responseContent = this.mainService.get(url, null); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() - .fromJson(tmpJsonElement.getAsJsonObject().get("department"), + .fromJson(tmpJsonObject.get("department"), new TypeToken>() { }.getType() ); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java index 55579ff05..b83b6d39a 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java @@ -6,10 +6,8 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.fs.FileUtils; import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor; import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; -import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.cp.api.WxCpMediaService; import me.chanjar.weixin.cp.api.WxCpService; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import java.io.File; import java.io.IOException; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMenuServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMenuServiceImpl.java index 85abe71f4..d008e7708 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMenuServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMenuServiceImpl.java @@ -5,7 +5,6 @@ import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.cp.api.WxCpMenuService; import me.chanjar.weixin.cp.api.WxCpService; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Menu.*; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImpl.java index 2005bc36e..f271149ee 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImpl.java @@ -1,24 +1,18 @@ package me.chanjar.weixin.cp.api.impl; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; -import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.URIUtil; import me.chanjar.weixin.common.util.json.GsonHelper; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpOAuth2Service; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo; import me.chanjar.weixin.cp.bean.WxCpUserDetail; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import static me.chanjar.weixin.common.api.WxConsts.OAuth2Scope.*; -import static me.chanjar.weixin.common.api.WxConsts.OAuth2Scope.SNSAPI_PRIVATEINFO; -import static me.chanjar.weixin.common.api.WxConsts.OAuth2Scope.SNSAPI_USERINFO; import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.OAuth2.*; /** @@ -74,8 +68,7 @@ public class WxCpOAuth2ServiceImpl implements WxCpOAuth2Service { @Override public WxCpOauth2UserInfo getUserInfo(Integer agentId, String code) throws WxErrorException { String responseText = this.mainService.get(String.format(this.mainService.getWxCpConfigStorage().getApiUrl(GET_USER_INFO), code, agentId), null); - JsonElement je = new JsonParser().parse(responseText); - JsonObject jo = je.getAsJsonObject(); + JsonObject jo = GsonParser.parse(responseText); return WxCpOauth2UserInfo.builder() .userId(GsonHelper.getString(jo, "UserId")) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java index 0484e1f62..c626f6f56 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java @@ -1,13 +1,13 @@ package me.chanjar.weixin.cp.api.impl; import com.google.gson.JsonArray; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import lombok.NonNull; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpOaService; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.oa.*; @@ -64,10 +64,10 @@ public class WxCpOaServiceImpl implements WxCpOaService { final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_DATA); String responseContent = this.mainService.post(url, jsonObject.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() .fromJson( - tmpJsonElement.getAsJsonObject().get("checkindata"), + tmpJson.get("checkindata"), new TypeToken>() { }.getType() ); @@ -94,11 +94,11 @@ public class WxCpOaServiceImpl implements WxCpOaService { final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_OPTION); String responseContent = this.mainService.post(url, jsonObject.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() .fromJson( - tmpJsonElement.getAsJsonObject().get("info"), + tmpJson.get("info"), new TypeToken>() { }.getType() ); @@ -202,9 +202,9 @@ public class WxCpOaServiceImpl implements WxCpOaService { final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_DIAL_RECORD); String responseContent = this.mainService.post(url, jsonObject.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); - return WxCpGsonBuilder.create().fromJson(tmpJsonElement.getAsJsonObject().get("record"), + return WxCpGsonBuilder.create().fromJson(tmpJson.get("record"), new TypeToken>() { }.getType() ); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java index 016c880fd..d886d3153 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpServiceImpl.java @@ -1,11 +1,11 @@ package me.chanjar.weixin.cp.api.impl; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; @@ -88,7 +88,7 @@ public class WxCpServiceImpl extends WxCpServiceApacheHttpClientImpl { // 拿到锁之后,再次判断一下最新的token是否过期,避免重刷 if (getWxCpConfigStorage().isAgentJsapiTicketExpired()) { String responseContent = this.get(getWxCpConfigStorage().getApiUrl(GET_AGENT_CONFIG_TICKET), null); - JsonObject jsonObject = new JsonParser().parse(responseContent).getAsJsonObject(); + JsonObject jsonObject = GsonParser.parse(responseContent); getWxCpConfigStorage().updateAgentJsapiTicket(jsonObject.get("ticket").getAsString(), jsonObject.get("expires_in").getAsInt()); } @@ -112,7 +112,7 @@ public class WxCpServiceImpl extends WxCpServiceApacheHttpClientImpl { // 拿到锁之后,再次判断一下最新的token是否过期,避免重刷 if (getWxCpConfigStorage().isJsapiTicketExpired()) { String responseContent = this.get(getWxCpConfigStorage().getApiUrl(GET_JSAPI_TICKET), null); - JsonObject tmpJsonObject = new JsonParser().parse(responseContent).getAsJsonObject(); + JsonObject tmpJsonObject = GsonParser.parse(responseContent); getWxCpConfigStorage().updateJsapiTicket(tmpJsonObject.get("ticket").getAsString(), tmpJsonObject.get("expires_in").getAsInt()); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java index 753f2493a..9a507e461 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java @@ -4,6 +4,7 @@ import com.google.gson.*; import com.google.gson.reflect.TypeToken; import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.api.WxCpTagService; import me.chanjar.weixin.cp.bean.WxCpTag; @@ -49,8 +50,8 @@ public class WxCpTagServiceImpl implements WxCpTagService { private String create(JsonObject param) throws WxErrorException { String url = this.mainService.getWxCpConfigStorage().getApiUrl(TAG_CREATE); String responseContent = this.mainService.post(url, param.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return tmpJsonElement.getAsJsonObject().get("tagid").getAsString(); + JsonObject jsonObject = GsonParser.parse(responseContent); + return jsonObject.get("tagid").getAsString(); } @Override @@ -72,10 +73,10 @@ public class WxCpTagServiceImpl implements WxCpTagService { public List listAll() throws WxErrorException { String url = this.mainService.getWxCpConfigStorage().getApiUrl(TAG_LIST); String responseContent = this.mainService.get(url, null); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() .fromJson( - tmpJsonElement.getAsJsonObject().get("taglist"), + tmpJson.get("taglist"), new TypeToken>() { }.getType() ); @@ -85,10 +86,10 @@ public class WxCpTagServiceImpl implements WxCpTagService { public List listUsersByTagId(String tagId) throws WxErrorException { String url = String.format(this.mainService.getWxCpConfigStorage().getApiUrl(TAG_GET), tagId); String responseContent = this.mainService.get(url, null); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() .fromJson( - tmpJsonElement.getAsJsonObject().get("userlist"), + tmpJson.get("userlist"), new TypeToken>() { }.getType() ); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java index 97530a6e9..399396064 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTaskCardServiceImpl.java @@ -5,7 +5,6 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.api.WxCpTaskCardService; -import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import java.util.HashMap; import java.util.List; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java index 14e75125a..43df12657 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTpServiceApacheHttpClientImpl.java @@ -2,13 +2,13 @@ package me.chanjar.weixin.cp.api.impl; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.HttpType; import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; import me.chanjar.weixin.common.util.http.apache.DefaultApacheHttpClientBuilder; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.cp.config.WxCpTpConfigStorage; import me.chanjar.weixin.cp.constant.WxCpApiPathConsts; import org.apache.http.Consts; @@ -76,7 +76,7 @@ public class WxCpTpServiceApacheHttpClientImpl extends BaseWxCpTpServiceImpl>() { }.getType() ); @@ -107,10 +108,10 @@ public class WxCpUserServiceImpl implements WxCpUserService { String url = this.mainService.getWxCpConfigStorage().getApiUrl(USER_SIMPLE_LIST + departId); String responseContent = this.mainService.get(url, params); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); return WxCpGsonBuilder.create() .fromJson( - tmpJsonElement.getAsJsonObject().get("userlist"), + tmpJson.get("userlist"), new TypeToken>() { }.getType() ); @@ -158,14 +159,14 @@ public class WxCpUserServiceImpl implements WxCpUserService { } String responseContent = this.mainService.post(url, jsonObject.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); + JsonObject tmpJson = GsonParser.parse(responseContent); Map result = Maps.newHashMap(); - if (tmpJsonElement.getAsJsonObject().get("openid") != null) { - result.put("openid", tmpJsonElement.getAsJsonObject().get("openid").getAsString()); + if (tmpJson.get("openid") != null) { + result.put("openid", tmpJson.get("openid").getAsString()); } - if (tmpJsonElement.getAsJsonObject().get("appid") != null) { - result.put("appid", tmpJsonElement.getAsJsonObject().get("appid").getAsString()); + if (tmpJson.get("appid") != null) { + result.put("appid", tmpJson.get("appid").getAsString()); } return result; @@ -177,8 +178,8 @@ public class WxCpUserServiceImpl implements WxCpUserService { jsonObject.addProperty("openid", openid); String url = this.mainService.getWxCpConfigStorage().getApiUrl(USER_CONVERT_TO_USERID); String responseContent = this.mainService.post(url, jsonObject.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return tmpJsonElement.getAsJsonObject().get("userid").getAsString(); + JsonObject tmpJson = GsonParser.parse(responseContent); + return tmpJson.get("userid").getAsString(); } @Override @@ -187,8 +188,8 @@ public class WxCpUserServiceImpl implements WxCpUserService { jsonObject.addProperty("mobile", mobile); String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_USER_ID); String responseContent = this.mainService.post(url, jsonObject.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return tmpJsonElement.getAsJsonObject().get("userid").getAsString(); + JsonObject tmpJson = GsonParser.parse(responseContent); + return tmpJson.get("userid").getAsString(); } @Override diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpInviteResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpInviteResult.java index ccf6fc94d..f5a0a66bf 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpInviteResult.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpInviteResult.java @@ -1,12 +1,7 @@ package me.chanjar.weixin.cp.bean; import java.io.Serializable; -import java.util.Collections; -import java.util.List; -import org.apache.commons.lang3.StringUtils; - -import com.google.common.base.Splitter; import com.google.gson.annotations.SerializedName; import lombok.Data; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlMessage.java index f20f74b75..f39b062c0 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlMessage.java @@ -8,16 +8,7 @@ import com.thoughtworks.xstream.annotations.XStreamConverter; import lombok.Data; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.util.XmlUtils; -import me.chanjar.weixin.common.util.crypto.WxCryptUtil; import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; -import me.chanjar.weixin.cp.bean.outxmlbuilder.ImageBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.NewsBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.TextBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.VideoBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.VoiceBuilder; -import me.chanjar.weixin.cp.config.WxCpConfigStorage; -import me.chanjar.weixin.cp.config.WxCpTpConfigStorage; -import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil; import me.chanjar.weixin.cp.util.xml.XStreamTransformer; /** diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java index 0e22b626b..e7af1dd61 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java @@ -8,13 +8,6 @@ import com.thoughtworks.xstream.annotations.XStreamConverter; import lombok.Data; import me.chanjar.weixin.common.util.XmlUtils; import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; -import me.chanjar.weixin.cp.bean.outxmlbuilder.ImageBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.NewsBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.TextBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.VideoBuilder; -import me.chanjar.weixin.cp.bean.outxmlbuilder.VoiceBuilder; -import me.chanjar.weixin.cp.config.WxCpConfigStorage; -import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil; import me.chanjar.weixin.cp.util.xml.XStreamTransformer; /** diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUnassignList.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUnassignList.java index ec86dea76..650171a41 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUnassignList.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUserExternalUnassignList.java @@ -1,6 +1,5 @@ package me.chanjar.weixin.cp.bean; -import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; import lombok.Getter; import lombok.Setter; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpTemplateResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpTemplateResult.java index df25aabf3..b8dd2dbe9 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpTemplateResult.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpTemplateResult.java @@ -1,15 +1,12 @@ package me.chanjar.weixin.cp.bean.oa; -import com.google.gson.JsonObject; import com.google.gson.annotations.SerializedName; import lombok.Data; import me.chanjar.weixin.cp.bean.oa.templatedata.TemplateContent; -import me.chanjar.weixin.cp.bean.oa.templatedata.TemplateControls; import me.chanjar.weixin.cp.bean.oa.templatedata.TemplateTitle; import java.io.Serializable; import java.util.List; -import java.util.Map; /** * 审批模板详情 diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/TemplateControls.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/TemplateControls.java index bc9919ac3..b9d463038 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/TemplateControls.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/TemplateControls.java @@ -3,7 +3,6 @@ package me.chanjar.weixin.cp.bean.oa.templatedata; import lombok.Data; import java.io.Serializable; -import java.util.Map; /** * @author Administrator diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/control/TemplateAttendance.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/control/TemplateAttendance.java index 21dca126e..7f641611a 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/control/TemplateAttendance.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/templatedata/control/TemplateAttendance.java @@ -5,7 +5,6 @@ import lombok.Data; import me.chanjar.weixin.cp.bean.oa.templatedata.TemplateDateRange; import java.io.Serializable; -import java.util.Map; /** * @author gyv12345@163.com diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java index f18f8b742..22cee8f40 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java @@ -8,7 +8,6 @@ import org.testng.annotations.Guice; import org.testng.annotations.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.testng.Assert.*; /** *
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java
index 1c489e351..9f7973561 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java
@@ -2,21 +2,17 @@ package me.chanjar.weixin.cp.api.impl;
 
 import com.google.gson.JsonObject;
 import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.cp.api.WxCpService;
 import me.chanjar.weixin.cp.api.WxCpTpService;
 import me.chanjar.weixin.cp.bean.WxCpTpAuthInfo;
 import me.chanjar.weixin.cp.bean.WxCpTpCorp;
 import me.chanjar.weixin.cp.bean.WxCpTpPermanentCodeInfo;
 import me.chanjar.weixin.cp.config.WxCpTpConfigStorage;
 import me.chanjar.weixin.cp.config.impl.WxCpTpDefaultConfigImpl;
-import me.chanjar.weixin.cp.constant.WxCpApiPathConsts;
 import org.testng.annotations.Test;
 
 import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tp.GET_AUTH_INFO;
 import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tp.GET_PERMANENT_CODE;
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.*;
 import static org.testng.Assert.*;
 
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java
index b785fc0aa..97c7d40fe 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java
@@ -9,14 +9,12 @@ import me.chanjar.weixin.cp.bean.WxCpAgent;
 import me.chanjar.weixin.cp.config.WxCpConfigStorage;
 import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
 import me.chanjar.weixin.cp.constant.WxCpApiPathConsts;
-import me.chanjar.weixin.cp.constant.WxCpConsts;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.contentOf;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 import static org.testng.Assert.assertEquals;
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImplTest.java
index 23c86768f..1f565fbff 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImplTest.java
@@ -15,7 +15,6 @@ import me.chanjar.weixin.cp.api.WxCpService;
 import me.chanjar.weixin.cp.bean.Gender;
 import me.chanjar.weixin.cp.bean.WxCpInviteResult;
 import me.chanjar.weixin.cp.bean.WxCpUser;
-import me.chanjar.weixin.cp.bean.WxCpUserExternalContactInfo;
 
 import static org.testng.Assert.*;
 
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java
index 7b0e75a58..5a54bfd8a 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java
@@ -3,7 +3,6 @@ package me.chanjar.weixin.cp.bean;
 import org.testng.annotations.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.testng.Assert.*;
 
 /**
  * .
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java
index 14d933da8..b6dda8130 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java
@@ -8,7 +8,6 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.Arrays;
 
 public class WxCpOAuth2Servlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
index ac48ceda8..19f9d36e9 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
@@ -7,7 +7,6 @@ import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.api.WxOcrService;
@@ -20,6 +19,7 @@ import me.chanjar.weixin.common.util.http.RequestExecutor;
 import me.chanjar.weixin.common.util.http.RequestHttp;
 import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
 import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import org.apache.commons.lang3.StringUtils;
 
@@ -37,7 +37,7 @@ import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ErrorCode.*;
  */
 @Slf4j
 public abstract class BaseWxMaServiceImpl implements WxMaService, RequestHttp {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private WxMaConfig wxMaConfig;
 
   private final WxMaMsgService kefuService = new WxMaMsgServiceImpl(this);
@@ -94,7 +94,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
       throw new WxErrorException(error);
     }
 
-    return JSON_PARSER.parse(responseContent).getAsJsonObject().get("unionid").getAsString();
+    return GsonParser.parse(responseContent).get("unionid").getAsString();
   }
 
   @Override
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaAnalysisServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaAnalysisServiceImpl.java
index 6eeffad2e..db6964271 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaAnalysisServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaAnalysisServiceImpl.java
@@ -10,10 +10,10 @@ import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitPage;
 import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitTrend;
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import org.apache.commons.lang3.time.DateFormatUtils;
 
 import java.lang.reflect.Type;
@@ -26,7 +26,7 @@ import java.util.List;
  */
 @AllArgsConstructor
 public class WxMaAnalysisServiceImpl implements WxMaAnalysisService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private WxMaService wxMaService;
 
   @Override
@@ -106,7 +106,7 @@ public class WxMaAnalysisServiceImpl implements WxMaAnalysisService {
    */
   private  List getAnalysisResultAsList(String url, Date beginDate, Date endDate, Type returnType) throws WxErrorException {
     String responseContent = this.wxMaService.post(url, toJson(beginDate, endDate));
-    JsonObject response = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject response = GsonParser.parse(responseContent);
     boolean hasList = response.has("list");
     if (hasList) {
       return WxMaGsonBuilder.create().fromJson(response.getAsJsonArray("list"), returnType);
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCloudServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCloudServiceImpl.java
index 55a80704c..300ded88f 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCloudServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCloudServiceImpl.java
@@ -11,11 +11,11 @@ import com.google.common.collect.Lists;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import org.apache.commons.lang3.StringUtils;
 
@@ -31,7 +31,7 @@ import java.util.*;
 @Slf4j
 @RequiredArgsConstructor
 public class WxMaCloudServiceImpl implements WxMaCloudService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private final WxMaService wxMaService;
 
   @Override
@@ -44,7 +44,7 @@ public class WxMaCloudServiceImpl implements WxMaCloudService {
   public String invokeCloudFunction(String env, String name, String body) throws WxErrorException {
     String cloudEnv = this.wxMaService.getWxMaConfig().getCloudEnv();
     final String response = this.wxMaService.post(String.format(INVOKE_CLOUD_FUNCTION_URL, cloudEnv, name), body);
-    return JSON_PARSER.parse(response).getAsJsonObject().get("resp_data").getAsString();
+    return GsonParser.parse(response).get("resp_data").getAsString();
   }
 
   @Override
@@ -59,8 +59,7 @@ public class WxMaCloudServiceImpl implements WxMaCloudService {
     params.addProperty("query", query);
 
     String responseContent = wxMaService.post(DATABASE_ADD_URL, params.toString());
-    JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-    JsonObject jsonObject = tmpJsonElement.getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent));
     }
@@ -84,8 +83,7 @@ public class WxMaCloudServiceImpl implements WxMaCloudService {
     params.addProperty("query", query);
 
     String responseContent = wxMaService.post(DATABASE_ADD_URL, params.toString());
-    JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-    JsonObject jsonObject = tmpJsonElement.getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent));
     }
@@ -102,7 +100,7 @@ public class WxMaCloudServiceImpl implements WxMaCloudService {
   @Override
   public JsonArray databaseAdd(String env, String query) throws WxErrorException {
     String response = this.wxMaService.post(DATABASE_ADD_URL, ImmutableMap.of("env", env, "query", query));
-    return JSON_PARSER.parse(response).getAsJsonObject().get("id_list").getAsJsonArray();
+    return GsonParser.parse(response).get("id_list").getAsJsonArray();
   }
 
   @Override
@@ -116,8 +114,7 @@ public class WxMaCloudServiceImpl implements WxMaCloudService {
     params.addProperty("query", query);
 
     String responseContent = wxMaService.post(DATABASE_DELETE_URL, params.toString());
-    JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-    JsonObject jsonObject = tmpJsonElement.getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent));
     }
@@ -133,7 +130,7 @@ public class WxMaCloudServiceImpl implements WxMaCloudService {
   @Override
   public int databaseDelete(String env, String query) throws WxErrorException {
     String response = this.wxMaService.post(DATABASE_DELETE_URL, ImmutableMap.of("env", env, "query", query));
-    return JSON_PARSER.parse(response).getAsJsonObject().get("deleted").getAsInt();
+    return GsonParser.parse(response).get("deleted").getAsInt();
   }
 
   @Override
@@ -214,7 +211,7 @@ public class WxMaCloudServiceImpl implements WxMaCloudService {
   @Override
   public JsonArray databaseAggregate(String env, String query) throws WxErrorException {
     String response = this.wxMaService.post(DATABASE_AGGREGATE_URL, ImmutableMap.of("env", env, "query", query));
-    return JSON_PARSER.parse(response).getAsJsonObject().get("data").getAsJsonArray();
+    return GsonParser.parse(response).get("data").getAsJsonArray();
   }
 
   @Override
@@ -228,7 +225,7 @@ public class WxMaCloudServiceImpl implements WxMaCloudService {
     params.addProperty("query", query);
 
     String responseContent = wxMaService.post(DATABASE_COUNT_URL, params.toString());
-    return JSON_PARSER.parse(responseContent).getAsJsonObject().get("count").getAsLong();
+    return GsonParser.parse(responseContent).get("count").getAsLong();
   }
 
   @Override
@@ -240,7 +237,7 @@ public class WxMaCloudServiceImpl implements WxMaCloudService {
   @Override
   public Long databaseCount(String env, String query) throws WxErrorException {
     String response = this.wxMaService.post(DATABASE_COUNT_URL, ImmutableMap.of("env", env, "query", query));
-    return JSON_PARSER.parse(response).getAsJsonObject().get("count").getAsLong();
+    return GsonParser.parse(response).get("count").getAsLong();
   }
 
   @Override
@@ -283,7 +280,7 @@ public class WxMaCloudServiceImpl implements WxMaCloudService {
     params.addProperty("conflict_mode", conflictMode);
 
     String response = this.wxMaService.post(DATABASE_MIGRATE_IMPORT_URL, params.toString());
-    return JSON_PARSER.parse(response).getAsJsonObject().get("job_id").getAsLong();
+    return GsonParser.parse(response).get("job_id").getAsLong();
   }
 
   @Override
@@ -301,7 +298,7 @@ public class WxMaCloudServiceImpl implements WxMaCloudService {
     params.addProperty("query", query);
 
     String response = this.wxMaService.post(DATABASE_MIGRATE_EXPORT_URL, params.toString());
-    return JSON_PARSER.parse(response).getAsJsonObject().get("job_id").getAsLong();
+    return GsonParser.parse(response).get("job_id").getAsLong();
   }
 
   @Override
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCodeServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCodeServiceImpl.java
index 2afdce509..2d965b4c4 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCodeServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaCodeServiceImpl.java
@@ -9,6 +9,7 @@ import java.nio.file.Path;
 import java.util.List;
 
 import lombok.AllArgsConstructor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import org.apache.commons.lang3.StringUtils;
 
 import cn.binarywang.wx.miniapp.api.WxMaCodeService;
@@ -20,7 +21,6 @@ import cn.binarywang.wx.miniapp.bean.code.WxMaCodeSubmitAuditRequest;
 import cn.binarywang.wx.miniapp.bean.code.WxMaCodeVersionDistribution;
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
@@ -34,7 +34,7 @@ import me.chanjar.weixin.common.util.json.GsonHelper;
  */
 @AllArgsConstructor
 public class WxMaCodeServiceImpl implements WxMaCodeService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private WxMaService wxMaService;
 
   @Override
@@ -73,7 +73,7 @@ public class WxMaCodeServiceImpl implements WxMaCodeService {
   @Override
   public List getCategory() throws WxErrorException {
     String responseContent = this.wxMaService.get(GET_CATEGORY_URL, null);
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     boolean hasCategoryList = jsonObject.has("category_list");
     if (hasCategoryList) {
       return WxMaGsonBuilder.create().fromJson(jsonObject.getAsJsonArray("category_list"),
@@ -87,7 +87,7 @@ public class WxMaCodeServiceImpl implements WxMaCodeService {
   @Override
   public List getPage() throws WxErrorException {
     String responseContent = this.wxMaService.get(GET_PAGE_URL, null);
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     boolean hasPageList = jsonObject.has("page_list");
     if (hasPageList) {
       return WxMaGsonBuilder.create().fromJson(jsonObject.getAsJsonArray("page_list"),
@@ -101,7 +101,7 @@ public class WxMaCodeServiceImpl implements WxMaCodeService {
   @Override
   public long submitAudit(WxMaCodeSubmitAuditRequest auditRequest) throws WxErrorException {
     String responseContent = this.wxMaService.post(SUBMIT_AUDIT_URL, auditRequest.toJson());
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     return GsonHelper.getLong(jsonObject, "auditid");
   }
 
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java
index ed5b375e2..a5c8376bc 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaJsapiServiceImpl.java
@@ -2,14 +2,13 @@ package cn.binarywang.wx.miniapp.api.impl;
 
 import cn.binarywang.wx.miniapp.api.WxMaJsapiService;
 import cn.binarywang.wx.miniapp.api.WxMaService;
-import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.RandomUtils;
 import me.chanjar.weixin.common.util.crypto.SHA1;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 import java.util.concurrent.locks.Lock;
 
@@ -22,7 +21,7 @@ import java.util.concurrent.locks.Lock;
  */
 @AllArgsConstructor
 public class WxMaJsapiServiceImpl implements WxMaJsapiService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
 
   private WxMaService wxMaService;
 
@@ -42,8 +41,7 @@ public class WxMaJsapiServiceImpl implements WxMaJsapiService {
 
       if (this.wxMaService.getWxMaConfig().isCardApiTicketExpired()) {
         String responseContent = this.wxMaService.get(GET_JSAPI_TICKET_URL + "?type=wx_card", null);
-        JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-        JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
+        JsonObject tmpJsonObject = GsonParser.parse(responseContent);
         String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
         int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
         this.wxMaService.getWxMaConfig().updateCardApiTicket(jsapiTicket, expiresInSeconds);
@@ -70,8 +68,7 @@ public class WxMaJsapiServiceImpl implements WxMaJsapiService {
 
       if (this.wxMaService.getWxMaConfig().isJsapiTicketExpired()) {
         String responseContent = this.wxMaService.get(GET_JSAPI_TICKET_URL + "?type=jsapi", null);
-        JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-        JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
+        JsonObject tmpJsonObject = GsonParser.parse(responseContent);
         String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
         int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
         this.wxMaService.getWxMaConfig().updateJsapiTicket(jsapiTicket, expiresInSeconds);
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java
index f20e0fc28..8e6a3f2ca 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveGoodsServiceImpl.java
@@ -14,6 +14,7 @@ import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 import java.io.Serializable;
 import java.util.HashMap;
@@ -29,7 +30,6 @@ import java.util.Map;
  */
 @AllArgsConstructor
 public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
 
   private WxMaService wxMaService;
 
@@ -38,7 +38,7 @@ public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService {
     Map map = new HashMap<>(2);
     map.put("goodsInfo", goods);
     String responseContent = this.wxMaService.post(ADD_GOODS, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -51,7 +51,7 @@ public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService {
     map.put("auditId", auditId);
     map.put("goodsId", goodsId);
     String responseContent = this.wxMaService.post(RESET_AUDIT_GOODS, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -63,7 +63,7 @@ public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService {
     Map map = new HashMap<>(2);
     map.put("goodsId", goodsId);
     String responseContent = this.wxMaService.post(AUDIT_GOODS, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -75,7 +75,7 @@ public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService {
     Map map = new HashMap<>(2);
     map.put("goodsId", goodsId);
     String responseContent = this.wxMaService.post(DELETE_GOODS, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -87,7 +87,7 @@ public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService {
     Map map = new HashMap<>(2);
     map.put("goodsInfo", goods);
     String responseContent = this.wxMaService.post(UPDATE_GOODS, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -99,7 +99,7 @@ public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService {
     Map map = new HashMap<>(2);
     map.put("goods_ids", goodsIds);
     String responseContent = this.wxMaService.post(GET_GOODS_WARE_HOUSE, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -110,7 +110,7 @@ public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService {
   public WxMaLiveResult getApprovedGoods(Integer offset, Integer limit, Integer status) throws WxErrorException {
     ImmutableMap params = ImmutableMap.of("status", status, "offset", offset, "limit", limit);
     String responseContent = wxMaService.get(GET_APPROVED_GOODS, Joiner.on("&").withKeyValueSeparator("=").join(params));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java
index 4e8857769..a5238ef08 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLiveServiceImpl.java
@@ -6,12 +6,12 @@ import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo;
 import cn.binarywang.wx.miniapp.bean.WxMaLiveResult;
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -28,13 +28,12 @@ import java.util.Map;
 @Slf4j
 @AllArgsConstructor
 public class WxMaLiveServiceImpl implements WxMaLiveService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
   private final WxMaService wxMaService;
 
   @Override
   public Integer createRoom(WxMaLiveInfo.RoomInfo roomInfo) throws WxErrorException {
     String responseContent = this.wxMaService.post(CREATE_ROOM, WxMaGsonBuilder.create().toJson(roomInfo));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -95,7 +94,7 @@ public class WxMaLiveServiceImpl implements WxMaLiveService {
     map.put("roomId", roomId);
     map.put("ids", goodsIds);
     String responseContent = this.wxMaService.post(ADD_GOODS, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -104,12 +103,12 @@ public class WxMaLiveServiceImpl implements WxMaLiveService {
 
   private JsonObject getLiveInfo(Integer start, Integer limit, Map map) throws WxErrorException {
     if (map == null) {
-      map = new HashMap<>(2);
+      map = new HashMap(2);
     }
     map.put("start", start);
     map.put("limit", limit);
     String responseContent = wxMaService.post(GET_LIVE_INFO, WxMaGsonBuilder.create().toJson(map));
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java
index c9e229e9e..50747a820 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImpl.java
@@ -6,18 +6,18 @@ import cn.binarywang.wx.miniapp.bean.*;
 import cn.binarywang.wx.miniapp.constant.WxMaConstants;
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 /**
  * @author Binary Wang
  */
 @AllArgsConstructor
 public class WxMaMsgServiceImpl implements WxMaMsgService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private WxMaService wxMaService;
 
   @Override
@@ -29,7 +29,7 @@ public class WxMaMsgServiceImpl implements WxMaMsgService {
   @Override
   public void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException {
     String responseContent = this.wxMaService.post(TEMPLATE_MSG_SEND_URL, templateMessage.toJson());
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -38,7 +38,7 @@ public class WxMaMsgServiceImpl implements WxMaMsgService {
   @Override
   public void sendSubscribeMsg(WxMaSubscribeMessage subscribeMessage) throws WxErrorException {
     String responseContent = this.wxMaService.post(SUBSCRIBE_MSG_SEND_URL, subscribeMessage.toJson());
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -47,7 +47,7 @@ public class WxMaMsgServiceImpl implements WxMaMsgService {
   @Override
   public void sendUniformMsg(WxMaUniformMessage uniformMessage) throws WxErrorException {
     String responseContent = this.wxMaService.post(UNIFORM_MSG_SEND_URL, uniformMessage.toJson());
-    JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) {
       throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
     }
@@ -56,7 +56,7 @@ public class WxMaMsgServiceImpl implements WxMaMsgService {
   @Override
   public JsonObject createUpdatableMessageActivityId() throws WxErrorException {
     final String responseContent = this.wxMaService.get(ACTIVITY_ID_CREATE_URL, null);
-    return JSON_PARSER.parse(responseContent).getAsJsonObject();
+    return GsonParser.parse(responseContent);
   }
 
   @Override
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImpl.java
index ffd54b3b1..8682612a9 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImpl.java
@@ -6,10 +6,10 @@ import cn.binarywang.wx.miniapp.bean.template.WxMaPubTemplateTitleListResult;
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
@@ -36,7 +36,7 @@ public class WxMaSubscribeServiceImpl implements WxMaSubscribeService {
   public List getPubTemplateKeyWordsById(String id) throws WxErrorException {
     String responseText = this.wxMaService.get(GET_PUB_TEMPLATE_KEY_WORDS_BY_ID_URL,
       Joiner.on("&").withKeyValueSeparator("=").join(ImmutableMap.of("tid", id)));
-    return WxMaGsonBuilder.create().fromJson(new JsonParser().parse(responseText).getAsJsonObject()
+    return WxMaGsonBuilder.create().fromJson(GsonParser.parse(responseText)
       .getAsJsonArray("data"), new TypeToken>() {
     }.getType());
   }
@@ -46,13 +46,13 @@ public class WxMaSubscribeServiceImpl implements WxMaSubscribeService {
     String responseText = this.wxMaService.post(TEMPLATE_ADD_URL, ImmutableMap.of("tid", id,
       "kidList", keywordIdList.toArray(),
       "sceneDesc", sceneDesc));
-    return new JsonParser().parse(responseText).getAsJsonObject().get("priTmplId").getAsString();
+    return GsonParser.parse(responseText).get("priTmplId").getAsString();
   }
 
   @Override
   public List getTemplateList() throws WxErrorException {
     String responseText = this.wxMaService.get(TEMPLATE_LIST_URL, null);
-    return WxMaGsonBuilder.create().fromJson(new JsonParser().parse(responseText).getAsJsonObject()
+    return WxMaGsonBuilder.create().fromJson(GsonParser.parse(responseText)
       .getAsJsonArray("data"), new TypeToken>() {
     }.getType());
   }
@@ -66,7 +66,7 @@ public class WxMaSubscribeServiceImpl implements WxMaSubscribeService {
   @Override
   public List getCategory() throws WxErrorException {
     String responseText = this.wxMaService.get(GET_CATEGORY_URL, null);
-    return WxMaGsonBuilder.create().fromJson(new JsonParser().parse(responseText).getAsJsonObject()
+    return WxMaGsonBuilder.create().fromJson(GsonParser.parse(responseText)
       .getAsJsonArray("data"), new TypeToken>() {
     }.getType());
   }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfo.java
index 8a9d7ea77..5e6ff641c 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfo.java
@@ -5,9 +5,9 @@ import java.util.List;
 
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 /**
  * 微信运动步数信息.
@@ -16,7 +16,7 @@ import lombok.Data;
  */
 @Data
 public class WxMaRunStepInfo implements Serializable {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final long serialVersionUID = -7496372171398607044L;
 
   /**
@@ -30,7 +30,7 @@ public class WxMaRunStepInfo implements Serializable {
   private Integer step;
 
   public static List fromJson(String json) {
-    JsonObject jsonObject = JSON_PARSER.parse(json).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(json);
     return WxMaGsonBuilder.create().fromJson(jsonObject.get("stepInfoList").toString(),
       new TypeToken>() {
       }.getType());
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/cloud/WxCloudDatabaseCreateIndexRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/cloud/WxCloudDatabaseCreateIndexRequest.java
index fbdba099f..9b551db25 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/cloud/WxCloudDatabaseCreateIndexRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/cloud/WxCloudDatabaseCreateIndexRequest.java
@@ -1,6 +1,5 @@
 package cn.binarywang.wx.miniapp.bean.cloud;
 
-import lombok.Builder;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressAccount.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressAccount.java
index a3f22b6a4..950bda306 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressAccount.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressAccount.java
@@ -2,12 +2,12 @@ package cn.binarywang.wx.miniapp.bean.express;
 
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 import java.io.Serializable;
 import java.util.List;
@@ -24,7 +24,7 @@ import java.util.List;
 @AllArgsConstructor
 public class WxMaExpressAccount implements Serializable {
 
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final long serialVersionUID = -4991983596742569736L;
 
   /**
@@ -95,7 +95,7 @@ public class WxMaExpressAccount implements Serializable {
   private List serviceType;
 
   public static List fromJsonList(String json) {
-    JsonObject jsonObject = JSON_PARSER.parse(json).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(json);
     return WxMaGsonBuilder.create().fromJson(jsonObject.get("list").toString(),
       new TypeToken>() {
       }.getType());
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressDelivery.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressDelivery.java
index b23bc4c41..dbdb02c11 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressDelivery.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressDelivery.java
@@ -2,12 +2,12 @@ package cn.binarywang.wx.miniapp.bean.express;
 
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 import java.io.Serializable;
 import java.util.List;
@@ -23,7 +23,7 @@ import java.util.List;
 @NoArgsConstructor
 @AllArgsConstructor
 public class WxMaExpressDelivery implements Serializable {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final long serialVersionUID = -8394544895730223810L;
 
   /**
@@ -63,7 +63,7 @@ public class WxMaExpressDelivery implements Serializable {
   private List serviceType;
 
   public static List fromJson(String json) {
-    JsonObject jsonObject = JSON_PARSER.parse(json).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(json);
     return WxMaGsonBuilder.create().fromJson(jsonObject.get("data").toString(),
       new TypeToken>() {
       }.getType());
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPrinter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPrinter.java
index 764f2ac89..b41d33305 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPrinter.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPrinter.java
@@ -1,7 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.express;
 
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -22,7 +21,7 @@ import java.util.List;
 @AllArgsConstructor
 public class WxMaExpressPrinter implements Serializable {
 
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final long serialVersionUID = 7164449984700322531L;
 
   /**
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/result/WxMaExpressOrderInfoResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/result/WxMaExpressOrderInfoResult.java
index 8a25950a9..fb47057d8 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/result/WxMaExpressOrderInfoResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/result/WxMaExpressOrderInfoResult.java
@@ -2,12 +2,12 @@ package cn.binarywang.wx.miniapp.bean.express.result;
 
 import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 
 import java.io.Serializable;
 import java.util.List;
@@ -24,7 +24,7 @@ import java.util.Map;
 @NoArgsConstructor
 @AllArgsConstructor
 public class WxMaExpressOrderInfoResult implements Serializable {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final long serialVersionUID = -9166603059965942285L;
 
   /**
@@ -66,7 +66,7 @@ public class WxMaExpressOrderInfoResult implements Serializable {
   }
 
   public static List toList(String json) {
-    JsonObject jsonObject = JSON_PARSER.parse(json).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(json);
     return WxMaGsonBuilder.create().fromJson(jsonObject.get("order_list").toString(),
       new TypeToken>() {
       }.getType());
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaPubTemplateTitleListResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaPubTemplateTitleListResult.java
index 21fab6afa..d2dacc6e6 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaPubTemplateTitleListResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaPubTemplateTitleListResult.java
@@ -1,8 +1,6 @@
 package cn.binarywang.wx.miniapp.bean.template;
 
-import lombok.AllArgsConstructor;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java
index eb64920cd..e9f68c097 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java
@@ -1,9 +1,7 @@
 package cn.binarywang.wx.miniapp.bean.template;
 
 import com.google.gson.annotations.SerializedName;
-import lombok.AllArgsConstructor;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java
index f32832d34..0714378b9 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java
@@ -1,9 +1,7 @@
 package cn.binarywang.wx.miniapp.bean.template;
 
 import com.google.gson.annotations.SerializedName;
-import lombok.AllArgsConstructor;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java
index 3ca42b46f..554ac1da9 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java
@@ -1,6 +1,5 @@
 package cn.binarywang.wx.miniapp.api.impl;
 
-import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.*;
 import cn.binarywang.wx.miniapp.constant.WxMaConstants;
 import org.testng.annotations.*;
@@ -12,8 +11,6 @@ import com.google.common.collect.Lists;
 import com.google.gson.JsonObject;
 import com.google.inject.Inject;
 import me.chanjar.weixin.common.error.WxErrorException;
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImplTest.java
index abd92bb77..dcf3726e3 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImplTest.java
@@ -1,19 +1,13 @@
 package cn.binarywang.wx.miniapp.api.impl;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
 import cn.binarywang.wx.miniapp.bean.WxMaShareInfo;
-import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.binarywang.wx.miniapp.test.ApiTestModule;
-import cn.binarywang.wx.miniapp.test.TestConfig;
-import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
-import me.chanjar.weixin.common.error.WxErrorException;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
 
 /**
  * 测试分享相关的接口
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfoTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfoTest.java
index ef09e0731..bbc87394d 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfoTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaRunStepInfoTest.java
@@ -5,7 +5,6 @@ import java.util.List;
 import org.testng.annotations.*;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.testng.Assert.*;
 
 /**
  * 
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImplTest.java
index d4fb45963..6fdcee10f 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImplTest.java
@@ -1,13 +1,11 @@
 package cn.binarywang.wx.miniapp.config.impl;
 
-import cn.binarywang.wx.miniapp.config.WxMaConfig;
 import lombok.SneakyThrows;
 import org.redisson.Redisson;
 import org.redisson.api.RedissonClient;
 import org.redisson.config.Config;
 import org.redisson.config.TransportMode;
 import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java
index f07c57b12..f6f775b6f 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java
@@ -4,7 +4,6 @@ import me.chanjar.weixin.common.api.WxConsts;
 import org.testng.annotations.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.testng.Assert.*;
 
 public class WxMaXmlOutMessageTest {
 
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/util/json/WxMaUniformMessageGsonAdapterTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/util/json/WxMaUniformMessageGsonAdapterTest.java
index c28711ab8..1ae60070c 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/util/json/WxMaUniformMessageGsonAdapterTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/util/json/WxMaUniformMessageGsonAdapterTest.java
@@ -2,7 +2,7 @@ package cn.binarywang.wx.miniapp.util.json;
 
 import cn.binarywang.wx.miniapp.bean.WxMaTemplateData;
 import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
-import com.google.gson.JsonParser;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import org.testng.annotations.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -33,7 +33,7 @@ public class WxMaUniformMessageGsonAdapterTest {
       .addData(new WxMaTemplateData("keyword3", "2014年9月22日", "#173177"))
       .addData(new WxMaTemplateData("remark", "欢迎再次购买!", "#173177"));
 
-    assertThat(message.toJson()).isEqualTo(new JsonParser().parse("{\n" +
+    assertThat(message.toJson()).isEqualTo(GsonParser.parse("{\n" +
       "    \"touser\":\"OPENID\",\n" +
       "    \"mp_template_msg\":{\n" +
       "        \"appid\":\"APPID\",\n" +
@@ -66,7 +66,7 @@ public class WxMaUniformMessageGsonAdapterTest {
       "            }\n" +
       "        }\n" +
       "    }\n" +
-      "}").getAsJsonObject().toString());
+      "}").toString());
   }
 
   @Test
@@ -84,7 +84,7 @@ public class WxMaUniformMessageGsonAdapterTest {
       .addData(new WxMaTemplateData("keyword3", "腾讯微信总部"))
       .addData(new WxMaTemplateData("keyword4", "广州市海珠区新港中路397号"));
 
-    assertThat(message.toJson()).isEqualTo(new JsonParser().parse("{\n" +
+    assertThat(message.toJson()).isEqualTo(GsonParser.parse("{\n" +
       "    \"touser\":\"OPENID\",\n" +
       "    \"weapp_template_msg\":{\n" +
       "        \"template_id\":\"TEMPLATE_ID\",\n" +
@@ -106,6 +106,6 @@ public class WxMaUniformMessageGsonAdapterTest {
       "        },\n" +
       "        \"emphasis_keyword\":\"keyword1.DATA\"\n" +
       "    }\n" +
-      "}").getAsJsonObject().toString());
+      "}").toString());
   }
 }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
index 0f2cb403e..7cd4e402e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
@@ -3,9 +3,7 @@ package me.chanjar.weixin.mp.api.impl;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
@@ -23,6 +21,7 @@ import me.chanjar.weixin.common.util.DataUtils;
 import me.chanjar.weixin.common.util.RandomUtils;
 import me.chanjar.weixin.common.util.crypto.SHA1;
 import me.chanjar.weixin.common.util.http.*;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import me.chanjar.weixin.mp.api.*;
 import me.chanjar.weixin.mp.bean.WxMpSemanticQuery;
@@ -48,7 +47,7 @@ import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.*;
  */
 @Slf4j
 public abstract class BaseWxMpServiceImpl implements WxMpService, RequestHttp {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
 
   protected WxSessionManager sessionManager = new StandardSessionManager();
   private WxMpKefuService kefuService = new WxMpKefuServiceImpl(this);
@@ -111,7 +110,7 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH
       if (this.getWxMpConfigStorage().isTicketExpired(type)) {
         String responseContent = execute(SimpleGetRequestExecutor.create(this),
           GET_TICKET_URL.getUrl(this.getWxMpConfigStorage()) + type.getCode(), null);
-        JsonObject tmpJsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+        JsonObject tmpJsonObject = GsonParser.parse(responseContent);
         String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
         int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
         this.getWxMpConfigStorage().updateTicket(type, jsapiTicket, expiresInSeconds);
@@ -166,8 +165,7 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH
     o.addProperty("action", "long2short");
     o.addProperty("long_url", longUrl);
     String responseContent = this.post(SHORTURL_API_URL, o.toString());
-    JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-    return tmpJsonElement.getAsJsonObject().get("short_url").getAsString();
+    return GsonParser.parse(responseContent).get("short_url").getAsString();
   }
 
   @Override
@@ -245,8 +243,8 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH
   @Override
   public String[] getCallbackIP() throws WxErrorException {
     String responseContent = this.get(GET_CALLBACK_IP_URL, null);
-    JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent);
-    JsonArray ipList = tmpJsonElement.getAsJsonObject().get("ip_list").getAsJsonArray();
+    JsonObject tmpJsonObject = GsonParser.parse(responseContent);
+    JsonArray ipList = tmpJsonObject.get("ip_list").getAsJsonArray();
     String[] ipArray = new String[ipList.size()];
     for (int i = 0; i < ipList.size(); i++) {
       ipArray[i] = ipList.get(i).getAsString();
@@ -434,7 +432,11 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH
   @Override
   public void addConfigStorage(String mpId, WxMpConfigStorage configStorages) {
     synchronized (this) {
-      this.configStorageMap.put(mpId, configStorages);
+      if (this.configStorageMap == null) {
+        this.setWxMpConfigStorage(configStorages);
+      } else {
+        this.configStorageMap.put(mpId, configStorages);
+      }
     }
   }
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java
index 5ac3be31f..831fc2a4c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpAiOpenServiceImpl.java
@@ -1,10 +1,10 @@
 package me.chanjar.weixin.mp.api.impl;
 
-import com.google.gson.JsonParser;
 import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.api.WxMpAiOpenService;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.enums.AiLangType;
@@ -23,7 +23,7 @@ import static me.chanjar.weixin.mp.enums.WxMpApiUrl.AiOpen.*;
  */
 @RequiredArgsConstructor
 public class WxMpAiOpenServiceImpl implements WxMpAiOpenService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private final WxMpService wxMpService;
 
   @Override
@@ -53,7 +53,7 @@ public class WxMpAiOpenServiceImpl implements WxMpAiOpenService {
       throw new WxErrorException(error);
     }
 
-    return JSON_PARSER.parse(response).getAsJsonObject().get("to_content").getAsString();
+    return GsonParser.parse(response).get("to_content").getAsString();
   }
 
   @Override
@@ -69,6 +69,6 @@ public class WxMpAiOpenServiceImpl implements WxMpAiOpenService {
       throw new WxErrorException(error);
     }
 
-    return JSON_PARSER.parse(response).getAsJsonObject().get("result").getAsString();
+    return GsonParser.parse(response).get("result").getAsString();
   }
 }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
index faba08acd..1e179c70f 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
@@ -9,6 +9,7 @@ import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.RandomUtils;
 import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import me.chanjar.weixin.mp.api.WxMpCardService;
 import me.chanjar.weixin.mp.api.WxMpService;
@@ -58,8 +59,7 @@ public class WxMpCardServiceImpl implements WxMpCardService {
       if (this.getWxMpService().getWxMpConfigStorage().isTicketExpired(type)) {
         String responseContent = this.wxMpService.execute(SimpleGetRequestExecutor
           .create(this.getWxMpService().getRequestHttp()), WxMpApiUrl.Card.CARD_GET_TICKET, null);
-        JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
-        JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
+        JsonObject tmpJsonObject = GsonParser.parse(responseContent);
         String cardApiTicket = tmpJsonObject.get("ticket").getAsString();
         int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
         this.getWxMpService().getWxMpConfigStorage().updateTicket(type, cardApiTicket, expiresInSeconds);
@@ -99,8 +99,7 @@ public class WxMpCardServiceImpl implements WxMpCardService {
     JsonObject param = new JsonObject();
     param.addProperty("encrypt_code", encryptCode);
     String responseContent = this.wxMpService.post(WxMpApiUrl.Card.CARD_CODE_DECRYPT, param.toString());
-    JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
-    JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
+    JsonObject tmpJsonObject = GsonParser.parse(responseContent);
     JsonPrimitive jsonPrimitive = tmpJsonObject.getAsJsonPrimitive("code");
     return jsonPrimitive.getAsString();
   }
@@ -159,7 +158,7 @@ public class WxMpCardServiceImpl implements WxMpCardService {
     String responseContent = this.wxMpService.post(WxMpApiUrl.Card.CARD_GET, param.toString());
 
     // 判断返回值
-    JsonObject json = (new JsonParser()).parse(responseContent).getAsJsonObject();
+    JsonObject json = GsonParser.parse(responseContent);
     String errcode = json.get("errcode").getAsString();
     if (!"0".equals(errcode)) {
       String errmsg = json.get("errmsg").getAsString();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDeviceServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDeviceServiceImpl.java
index 3aa122a53..0f7b807de 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDeviceServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDeviceServiceImpl.java
@@ -6,7 +6,6 @@ import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpDeviceService;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.device.*;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 
 import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Device.*;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImpl.java
index 6ec51e744..c3dff1265 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImpl.java
@@ -1,12 +1,11 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.api.WxMpMarketingService;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.marketing.WxMpAdLeadFilter;
@@ -38,8 +37,8 @@ public class WxMpMarketingServiceImpl implements WxMpMarketingService {
     json.addProperty("name", name);
     json.addProperty("description", description);
     String responseContent = wxMpService.post(USER_ACTION_SETS_ADD, json.toString());
-    JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
-    return tmpJsonElement.getAsJsonObject().get("data").getAsJsonObject().get("user_action_set_id").getAsLong();
+    JsonObject tmpJson = GsonParser.parse(responseContent);
+    return tmpJson.get("data").getAsJsonObject().get("user_action_set_id").getAsLong();
   }
 
   @Override
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java
index dcae606da..462604cb0 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImpl.java
@@ -11,7 +11,6 @@ import me.chanjar.weixin.mp.bean.result.WxMpMassGetResult;
 import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
 import me.chanjar.weixin.mp.bean.result.WxMpMassSpeedGetResult;
 import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 
 import static me.chanjar.weixin.mp.enums.WxMpApiUrl.*;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
index 4b852c03f..bf37f2c41 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
@@ -13,7 +13,6 @@ import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import me.chanjar.weixin.mp.api.WxMpMaterialService;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.material.*;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 import me.chanjar.weixin.mp.util.requestexecuter.material.*;
 import me.chanjar.weixin.mp.util.requestexecuter.media.MediaImgUploadRequestExecutor;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java
index 2a42a0a59..5631a44f7 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImpl.java
@@ -1,11 +1,11 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.bean.menu.WxMenu;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.api.WxMpMenuService;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.menu.WxMpGetSelfMenuInfoResult;
@@ -38,7 +38,7 @@ public class WxMpMenuServiceImpl implements WxMpMenuService {
     log.debug("创建菜单:{},结果:{}", menuJson, result);
 
     if (menu.getMatchRule() != null) {
-      return new JsonParser().parse(result).getAsJsonObject().get("menuid").getAsString();
+      return GsonParser.parse(result).get("menuid").getAsString();
     }
 
     return null;
@@ -46,8 +46,7 @@ public class WxMpMenuServiceImpl implements WxMpMenuService {
 
   @Override
   public String menuCreate(String json) throws WxErrorException {
-    JsonParser jsonParser = new JsonParser();
-    JsonObject jsonObject = jsonParser.parse(json).getAsJsonObject();
+    JsonObject jsonObject = GsonParser.parse(json);
     WxMpApiUrl.Menu url = MENU_CREATE;
     if (jsonObject.get("matchrule") != null) {
       url = MENU_ADDCONDITIONAL;
@@ -55,7 +54,7 @@ public class WxMpMenuServiceImpl implements WxMpMenuService {
 
     String result = this.wxMpService.post(url, json);
     if (jsonObject.get("matchrule") != null) {
-      return jsonParser.parse(result).getAsJsonObject().get("menuid").getAsString();
+      return GsonParser.parse(result).get("menuid").getAsString();
     }
 
     return null;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
index 913816595..58b48e9c7 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
@@ -1,13 +1,13 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.BeanUtils;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.WxMpStoreService;
 import me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo;
@@ -47,7 +47,7 @@ public class WxMpStoreServiceImpl implements WxMpStoreService {
     if (wxError.getErrorCode() != 0) {
       throw new WxErrorException(wxError);
     }
-    return WxMpStoreBaseInfo.fromJson(new JsonParser().parse(response).getAsJsonObject()
+    return WxMpStoreBaseInfo.fromJson(GsonParser.parse(response)
       .get("business").getAsJsonObject().get("base_info").toString());
   }
 
@@ -117,7 +117,7 @@ public class WxMpStoreServiceImpl implements WxMpStoreService {
     }
 
     return WxMpGsonBuilder.create().fromJson(
-      new JsonParser().parse(response).getAsJsonObject().get("category_list"),
+      GsonParser.parse(response).get("category_list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java
index daaf60c2f..f2da7571f 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java
@@ -1,17 +1,16 @@
 package me.chanjar.weixin.mp.api.impl;
 
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.WxMpTemplateMsgService;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 
 import java.util.List;
 
@@ -26,14 +25,14 @@ import static me.chanjar.weixin.mp.enums.WxMpApiUrl.TemplateMsg.*;
  */
 @RequiredArgsConstructor
 public class WxMpTemplateMsgServiceImpl implements WxMpTemplateMsgService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
 
   private final WxMpService wxMpService;
 
   @Override
   public String sendTemplateMsg(WxMpTemplateMessage templateMessage) throws WxErrorException {
     String responseContent = this.wxMpService.post(MESSAGE_TEMPLATE_SEND, templateMessage.toJson());
-    final JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    final JsonObject jsonObject = GsonParser.parse(responseContent);
     if (jsonObject.get("errcode").getAsInt() == 0) {
       return jsonObject.get("msgid").getAsString();
     }
@@ -62,7 +61,7 @@ public class WxMpTemplateMsgServiceImpl implements WxMpTemplateMsgService {
     JsonObject jsonObject = new JsonObject();
     jsonObject.addProperty("template_id_short", shortTemplateId);
     String responseContent = this.wxMpService.post(TEMPLATE_API_ADD_TEMPLATE, jsonObject.toString());
-    final JsonObject result = JSON_PARSER.parse(responseContent).getAsJsonObject();
+    final JsonObject result = GsonParser.parse(responseContent);
     if (result.get("errcode").getAsInt() == 0) {
       return result.get("template_id").getAsString();
     }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImpl.java
index cd7ac541a..a3c065e4d 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImpl.java
@@ -7,7 +7,6 @@ import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.WxMpUserBlacklistService;
 import me.chanjar.weixin.mp.bean.result.WxMpUserBlacklistGetResult;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.util.HashMap;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java
index 0c77a93ff..03c83e3b4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java
@@ -9,7 +9,6 @@ import me.chanjar.weixin.mp.bean.WxMpUserQuery;
 import me.chanjar.weixin.mp.bean.result.WxMpChangeOpenid;
 import me.chanjar.weixin.mp.bean.result.WxMpUser;
 import me.chanjar.weixin.mp.bean.result.WxMpUserList;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.util.HashMap;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java
index bf4696e49..1d2013fd3 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java
@@ -2,12 +2,12 @@ package me.chanjar.weixin.mp.api.impl;
 
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.WxType;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.WxMpUserTagService;
 import me.chanjar.weixin.mp.bean.tag.WxTagListUser;
@@ -134,7 +134,7 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService {
     String responseContent = this.wxMpService.post(TAGS_GETIDLIST, json.toString());
 
     return WxMpGsonBuilder.create().fromJson(
-      new JsonParser().parse(responseContent).getAsJsonObject().get("tagid_list"),
+      GsonParser.parse(responseContent).get("tagid_list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/Card.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/Card.java
index 506101089..6e0f32edc 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/Card.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/Card.java
@@ -2,7 +2,6 @@ package me.chanjar.weixin.mp.bean.card;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.io.Serializable;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCard.java
index b1becbd64..60c7c911b 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCard.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCard.java
@@ -1,6 +1,5 @@
 package me.chanjar.weixin.mp.bean.card;
 
-import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCard.java
index 0bfb5359b..1712b19eb 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCard.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCard.java
@@ -1,6 +1,5 @@
 package me.chanjar.weixin.mp.bean.card;
 
-import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardMpnewsGethtmlResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardMpnewsGethtmlResult.java
index d55950666..13db310d5 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardMpnewsGethtmlResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardMpnewsGethtmlResult.java
@@ -6,7 +6,6 @@ import me.chanjar.weixin.mp.bean.result.WxMpResult;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.io.Serializable;
-import java.util.List;
 
 
 @Data
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java
index 211054659..10d1dafca 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java
@@ -2,8 +2,6 @@ package me.chanjar.weixin.mp.bean.comment;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.common.util.xml.IntegerArrayConverter;
-import me.chanjar.weixin.mp.bean.device.WxDeviceQrCodeResult;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.io.Serializable;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
index f625072f8..d90aba2e3 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java
@@ -6,6 +6,7 @@ import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
@@ -116,7 +117,7 @@ public class WxDataCubeArticleResult extends WxDataCubeBaseResult {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
index 722b6c252..bb732c34d 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java
@@ -6,6 +6,7 @@ import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
@@ -42,7 +43,7 @@ public class WxDataCubeArticleTotal extends WxDataCubeBaseResult {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
index f86035c6b..0e9051d23 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
@@ -2,7 +2,6 @@ package me.chanjar.weixin.mp.bean.datacube;
 
 import java.io.Serializable;
 
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
@@ -18,7 +17,6 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 @Data
 public abstract class WxDataCubeBaseResult implements Serializable {
   private static final long serialVersionUID = 8780389911053297600L;
-  protected static final JsonParser JSON_PARSER = new JsonParser();
 
   /**
    * ref_date.
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
index 0207d288b..0cc54c7cc 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java
@@ -4,6 +4,7 @@ import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.util.List;
@@ -57,7 +58,7 @@ public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
index b8796009d..c556e5175 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java
@@ -4,6 +4,7 @@ import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.util.List;
@@ -70,7 +71,7 @@ public class WxDataCubeMsgResult extends WxDataCubeBaseResult {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
index f26ac1259..c278861dc 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
@@ -4,10 +4,9 @@ import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
 
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
@@ -20,7 +19,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
  */
 @Data
 public class WxDataCubeUserCumulate implements Serializable {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
 
   private static final long serialVersionUID = -3570981300225093657L;
 
@@ -30,7 +29,7 @@ public class WxDataCubeUserCumulate implements Serializable {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
index 4d28c7b99..75df60c55 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
@@ -4,10 +4,9 @@ import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
 
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
@@ -20,7 +19,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 public class WxDataCubeUserSummary implements Serializable {
   private static final long serialVersionUID = -2336654489906694173L;
 
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
 
   private Date refDate;
 
@@ -32,7 +31,7 @@ public class WxDataCubeUserSummary implements Serializable {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java
index 7f7b7db86..555ee9dba 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java
@@ -3,7 +3,6 @@ package me.chanjar.weixin.mp.bean.kefu.result;
 import java.io.Serializable;
 import java.util.List;
 
-import com.google.gson.GsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java
index 2b833aa20..785e2126d 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java
@@ -2,7 +2,6 @@ package me.chanjar.weixin.mp.bean.kefu.result;
 
 import java.io.Serializable;
 
-import com.google.gson.GsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpAdLeadResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpAdLeadResult.java
index 61805018b..7ce44ddbe 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpAdLeadResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpAdLeadResult.java
@@ -1,9 +1,9 @@
 package me.chanjar.weixin.mp.bean.marketing;
 
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.io.Serializable;
@@ -15,7 +15,6 @@ import java.util.List;
 @Data
 public class WxMpAdLeadResult implements Serializable {
   private static final long serialVersionUID = -1526796632563660821L;
-  protected static final JsonParser JSON_PARSER = new JsonParser();
 
   @SerializedName("page_info")
   private WxMpAdLeadPageInfo pageInfo;
@@ -25,7 +24,7 @@ public class WxMpAdLeadResult implements Serializable {
   public static WxMpAdLeadResult fromJson(String json) {
 
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("data"),
+      GsonParser.parse(json).get("data"),
       new TypeToken() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpUserActionSet.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpUserActionSet.java
index 84b0f4bba..1bf41b487 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpUserActionSet.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/marketing/WxMpUserActionSet.java
@@ -1,9 +1,9 @@
 package me.chanjar.weixin.mp.bean.marketing;
 
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.io.Serializable;
@@ -16,7 +16,6 @@ import java.util.List;
 @Data
 public class WxMpUserActionSet implements Serializable {
   private static final long serialVersionUID = 1979861770645159905L;
-  protected static final JsonParser JSON_PARSER = new JsonParser();
 
   /**
    * user_action_set_id
@@ -48,7 +47,7 @@ public class WxMpUserActionSet implements Serializable {
 
   public static List fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      JSON_PARSER.parse(json).getAsJsonObject().get("data").getAsJsonObject().get("list"),
+      GsonParser.parse(json).get("data").getAsJsonObject().get("list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
index 83782f66f..76d4f8bcc 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
@@ -3,9 +3,9 @@ package me.chanjar.weixin.mp.bean.tag;
 import java.io.Serializable;
 import java.util.List;
 
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
@@ -37,13 +37,13 @@ public class WxUserTag implements Serializable {
 
   public static WxUserTag fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      new JsonParser().parse(json).getAsJsonObject().get("tag"),
+      GsonParser.parse(json).get("tag"),
       WxUserTag.class);
   }
 
   public static List listFromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      new JsonParser().parse(json).getAsJsonObject().get("tags"),
+      GsonParser.parse(json).get("tags"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
index 2b3d45a7d..4458ec3a8 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
@@ -3,10 +3,10 @@ package me.chanjar.weixin.mp.bean.template;
 import java.io.Serializable;
 import java.util.List;
 
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import com.google.gson.reflect.TypeToken;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
@@ -19,7 +19,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
  */
 @Data
 public class WxMpTemplate implements Serializable {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final long serialVersionUID = -7366474522571199372L;
 
   /**
@@ -60,7 +60,7 @@ public class WxMpTemplate implements Serializable {
   private String example;
 
   public static List fromJson(String json) {
-    return WxMpGsonBuilder.create().fromJson(JSON_PARSER.parse(json).getAsJsonObject().get("template_list"),
+    return WxMpGsonBuilder.create().fromJson(GsonParser.parse(json).get("template_list"),
       new TypeToken>() {
       }.getType());
   }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopDataResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopDataResult.java
index 2a3c79502..50aec028d 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopDataResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopDataResult.java
@@ -1,8 +1,8 @@
 package me.chanjar.weixin.mp.bean.wifi;
 
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.util.List;
@@ -17,7 +17,7 @@ import java.util.List;
 public class WxMpWifiShopDataResult {
   public static WxMpWifiShopDataResult fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      new JsonParser().parse(json).getAsJsonObject().get("data"),
+      GsonParser.parse(json).get("data"),
       WxMpWifiShopDataResult.class);
   }
 
@@ -86,7 +86,7 @@ public class WxMpWifiShopDataResult {
    */
   @SerializedName("finishpage_url")
   private String finishPageUrl;
-  
+
   /**
    * 商户自己的id,与门店poi_id对应关系,建议在添加门店时候建立关联关系,具体请参考“微信门店接口”.
    */
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopListResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopListResult.java
index 4a86acb35..63bd638d4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopListResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/wifi/WxMpWifiShopListResult.java
@@ -1,8 +1,8 @@
 package me.chanjar.weixin.mp.bean.wifi;
 
-import com.google.gson.JsonParser;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 import java.util.List;
@@ -18,7 +18,7 @@ import java.util.List;
 public class WxMpWifiShopListResult {
   public static WxMpWifiShopListResult fromJson(String json) {
     return WxMpGsonBuilder.create().fromJson(
-      new JsonParser().parse(json).getAsJsonObject().get("data"),
+      GsonParser.parse(json).get("data"),
       WxMpWifiShopListResult.class);
   }
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java
index 8ceba29c2..9f22dbed3 100755
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/crypto/WxMpCryptUtil.java
@@ -20,7 +20,6 @@ package me.chanjar.weixin.mp.util.crypto;
 import com.google.common.base.CharMatcher;
 import com.google.common.io.BaseEncoding;
 import me.chanjar.weixin.mp.config.WxMpConfigStorage;
-import org.apache.commons.codec.binary.Base64;
 
 public class WxMpCryptUtil extends me.chanjar.weixin.common.util.crypto.WxCryptUtil {
 
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImplTest.java
index 3d1b74e6c..dd15496e1 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMarketingServiceImplTest.java
@@ -9,8 +9,6 @@ import me.chanjar.weixin.mp.bean.marketing.WxMpUserAction;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
-import static org.testng.Assert.*;
-
 /**
  * 测试类.
  *
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java
index 89069bd29..2d27e4dac 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java
@@ -9,7 +9,6 @@ import me.chanjar.weixin.mp.bean.WxMpUserQuery;
 import me.chanjar.weixin.mp.bean.result.WxMpChangeOpenid;
 import me.chanjar.weixin.mp.bean.result.WxMpUser;
 import me.chanjar.weixin.mp.bean.result.WxMpUserList;
-import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 import org.testng.Assert;
 import org.testng.annotations.BeforeTest;
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResultTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResultTest.java
index f7860e7c8..573fa2860 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResultTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/membercard/WxMpMemberCardUpdateResultTest.java
@@ -2,7 +2,6 @@ package me.chanjar.weixin.mp.bean.membercard;
 
 import org.testng.annotations.Test;
 
-import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/menu/WxMpGetSelfMenuInfoResultTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/menu/WxMpGetSelfMenuInfoResultTest.java
index 3df574270..0b80ed083 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/menu/WxMpGetSelfMenuInfoResultTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/menu/WxMpGetSelfMenuInfoResultTest.java
@@ -5,7 +5,6 @@ import org.testng.annotations.Test;
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.testng.Assert.*;
 
 /**
  * @author Binary Wang
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
index e111b5a18..5e54929a0 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
@@ -2,7 +2,6 @@ package me.chanjar.weixin.open.api.impl;
 
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -10,6 +9,7 @@ import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.crypto.SHA1;
 import me.chanjar.weixin.common.util.http.URIUtil;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
@@ -33,7 +33,7 @@ import java.util.concurrent.locks.Lock;
 @Slf4j
 @AllArgsConstructor
 public class WxOpenComponentServiceImpl implements WxOpenComponentService {
-  private static final JsonParser JSON_PARSER = new JsonParser();
+
   private static final Map WX_OPEN_MA_SERVICE_MAP = new ConcurrentHashMap<>();
   private static final Map WX_OPEN_MP_SERVICE_MAP = new ConcurrentHashMap<>();
   private static final Map WX_OPEN_FAST_MA_SERVICE_MAP = new ConcurrentHashMap<>();
@@ -435,7 +435,7 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
   @Override
   public List getTemplateDraftList() throws WxErrorException {
     String responseContent = get(GET_TEMPLATE_DRAFT_LIST_URL, "access_token");
-    JsonObject response = JSON_PARSER.parse(StringUtils.defaultString(responseContent, "{}")).getAsJsonObject();
+    JsonObject response = GsonParser.parse(StringUtils.defaultString(responseContent, "{}"));
     boolean hasDraftList = response.has("draft_list");
     if (hasDraftList) {
       return WxOpenGsonBuilder.create().fromJson(response.getAsJsonArray("draft_list"),
@@ -449,7 +449,7 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
   @Override
   public List getTemplateList() throws WxErrorException {
     String responseContent = get(GET_TEMPLATE_LIST_URL, "access_token");
-    JsonObject response = JSON_PARSER.parse(StringUtils.defaultString(responseContent, "{}")).getAsJsonObject();
+    JsonObject response = GsonParser.parse(StringUtils.defaultString(responseContent, "{}"));
     boolean hasTemplateList = response.has("template_list");
     if (hasTemplateList) {
       return WxOpenGsonBuilder.create().fromJson(response.getAsJsonArray("template_list"),
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenCreateResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenCreateResult.java
index 6e06a16d4..274b5c49d 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenCreateResult.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenCreateResult.java
@@ -1,6 +1,5 @@
 package me.chanjar.weixin.open.bean;
 
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaPreviewInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaPreviewInfo.java
index a1f0416dd..47f8b37a3 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaPreviewInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaPreviewInfo.java
@@ -3,8 +3,6 @@ package me.chanjar.weixin.open.bean.ma;
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 
-import java.util.List;
-
 /**
  * @author zxfreedom
  * @description
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java
index b7e567182..cdc05af72 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/executor/MaQrCodeOkhttpRequestExecutor.java
@@ -11,8 +11,6 @@ import okhttp3.OkHttpClient;
 import okhttp3.Request;
 import okhttp3.Response;
 import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/WxOpenCryptUtil.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/WxOpenCryptUtil.java
index 5b11878d2..b507e0daa 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/WxOpenCryptUtil.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/WxOpenCryptUtil.java
@@ -3,7 +3,6 @@ package me.chanjar.weixin.open.util;
 import com.google.common.base.CharMatcher;
 import com.google.common.io.BaseEncoding;
 import me.chanjar.weixin.open.api.WxOpenConfigStorage;
-import org.apache.commons.codec.binary.Base64;
 
 /**
  * @author 007
diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImplTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImplTest.java
index 0e8cba5c3..47a5069f2 100644
--- a/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImplTest.java
+++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImplTest.java
@@ -2,8 +2,6 @@ package me.chanjar.weixin.open.api.impl;
 
 import org.testng.annotations.Test;
 
-import static org.testng.Assert.*;
-
 /**
  * 单元测试类.
  *
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java
index 6f8925471..79ca491ec 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequest.java
@@ -8,7 +8,6 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 import me.chanjar.weixin.common.annotation.Required;
-import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.util.Map;
 
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingFinishRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingFinishRequest.java
index c8200b4cc..3bff328b8 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingFinishRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingFinishRequest.java
@@ -2,7 +2,6 @@ package com.github.binarywang.wxpay.bean.profitsharing;
 
 import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
 import com.github.binarywang.wxpay.constant.WxPayConstants;
-import com.github.binarywang.wxpay.exception.WxPayException;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import lombok.*;
 import me.chanjar.weixin.common.annotation.Required;
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
index d67edc1ab..6a2d3b46d 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundQueryResult.java
@@ -1,11 +1,11 @@
 package com.github.binarywang.wxpay.bean.result;
 
 import com.google.common.collect.Lists;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
+import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import lombok.*;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import org.apache.commons.lang3.StringUtils;
 import org.w3c.dom.Document;
@@ -149,10 +149,10 @@ public class WxPayRefundQueryResult extends BaseWxPayResult implements Serializa
       return;
     }
 
-    JsonElement tmpJsonElement = new JsonParser().parse(this.promotionDetailString);
+    JsonObject tmpJson = GsonParser.parse(this.promotionDetailString);
 
     final List promotionDetail = WxGsonBuilder.create()
-      .fromJson(tmpJsonElement.getAsJsonObject().get("promotion_detail"),
+      .fromJson(tmpJson.get("promotion_detail"),
         new TypeToken>() {
         }.getType()
       );
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java
index 8d21f7a0f..6b4de3d63 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayRefundResult.java
@@ -1,13 +1,13 @@
 package com.github.binarywang.wxpay.bean.result;
 
 import com.google.common.collect.Lists;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
+import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 import org.apache.commons.lang3.StringUtils;
 import org.w3c.dom.Document;
@@ -138,10 +138,10 @@ public class WxPayRefundResult extends BaseWxPayResult implements Serializable {
       return;
     }
 
-    JsonElement tmpJsonElement = new JsonParser().parse(this.promotionDetailString);
+    JsonObject tmpJson = GsonParser.parse(this.promotionDetailString);
 
     final List promotionDetail = WxGsonBuilder.create()
-      .fromJson(tmpJsonElement.getAsJsonObject().get("promotion_detail"),
+      .fromJson(tmpJson.get("promotion_detail"),
         new TypeToken>() {
         }.getType()
       );
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/PayScoreService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/PayScoreService.java
index d4d3b245e..ff6aafe9f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/PayScoreService.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/PayScoreService.java
@@ -5,8 +5,6 @@ import com.github.binarywang.wxpay.bean.payscore.WxPayScoreRequest;
 import com.github.binarywang.wxpay.bean.payscore.WxPayScoreResult;
 import com.github.binarywang.wxpay.exception.WxPayException;
 
-import java.net.URISyntaxException;
-
 /**
  * 
  *  支付分相关服务类.
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java
index c3a2b7219..3500ad41e 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java
@@ -1,8 +1,6 @@
 package com.github.binarywang.wxpay.service.impl;
 
 import com.github.binarywang.wxpay.bean.profitsharing.*;
-import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingResult;
-import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingRequest;
 import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.ProfitSharingService;
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java
index 1b2d08984..951451a1d 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java
@@ -3,8 +3,8 @@ package com.github.binarywang.wxpay.service.impl;
 import com.github.binarywang.wxpay.bean.WxPayApiData;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import jodd.util.Base64;
+import me.chanjar.weixin.common.util.json.GsonParser;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpStatus;
@@ -38,7 +38,6 @@ import java.nio.charset.StandardCharsets;
  * @author Binary Wang
  */
 public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl {
-  private final static JsonParser JSON_PARSER = new JsonParser();
 
   @Override
   public byte[] postForBytes(String url, String requestStr, boolean useKey) throws WxPayException {
@@ -104,7 +103,7 @@ public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl {
         return responseString;
       } else {
         //有错误提示信息返回
-        JsonObject jsonObject = JSON_PARSER.parse(responseString).getAsJsonObject();
+        JsonObject jsonObject = GsonParser.parse(responseString);
         throw new WxPayException(jsonObject.get("message").getAsString());
       }
     } catch (Exception e) {
@@ -132,7 +131,7 @@ public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl {
         return responseString;
       } else {
         //有错误提示信息返回
-        JsonObject jsonObject = JSON_PARSER.parse(responseString).getAsJsonObject();
+        JsonObject jsonObject = GsonParser.parse(responseString);
         throw new WxPayException(jsonObject.get("message").getAsString());
       }
     } catch (Exception e) {
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayCredentials.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayCredentials.java
index 2654e8675..9fca14e64 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayCredentials.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayCredentials.java
@@ -10,8 +10,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
 import org.apache.http.client.methods.HttpUriRequest;
 import org.apache.http.util.EntityUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @Slf4j
 public class WxPayCredentials implements Credentials {
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayValidator.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayValidator.java
index c83f8853e..9b9b0ad4d 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayValidator.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/WxPayValidator.java
@@ -9,8 +9,7 @@ import org.apache.http.Header;
 import org.apache.http.HttpEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.util.EntityUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 @Slf4j
 public class WxPayValidator implements Validator {
   private Verifier verifier;
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequestTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequestTest.java
index 2a2f030fc..5cd4dcdc1 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequestTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/entpay/EntPayRequestTest.java
@@ -2,8 +2,6 @@ package com.github.binarywang.wxpay.bean.entpay;
 
 import org.testng.annotations.Test;
 
-import static org.testng.Assert.*;
-
 /**
  * .
  *
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java
index 087ba7fc3..13f94d401 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImplTest.java
@@ -1,9 +1,6 @@
 package com.github.binarywang.wxpay.service.impl;
 
 import com.github.binarywang.wxpay.bean.profitsharing.*;
-import com.github.binarywang.wxpay.bean.profitsharing.ProfitSharingRequest;
-import com.github.binarywang.wxpay.bean.profitsharing.Receiver;
-import com.github.binarywang.wxpay.bean.profitsharing.ReceiverList;
 import com.github.binarywang.wxpay.constant.WxPayConstants;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;