Android如何解析相同接口返回不同格式json数据

这篇文章主要为大家展示了“Android如何解析相同接口返回不同格式json数据”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android如何解析相同接口返回不同格式json数据”这篇文章吧。

成都创新互联是一家集成都网站设计、成都网站建设、网站页面设计、网站优化SEO优化为一体的专业网站制作公司,已为成都等多地近百家企业提供网站建设服务。追求良好的浏览体验,以探求精品塑造与理念升华,设计最适合用户的网站页面。 合作只是第一步,服务才是根本,我们始终坚持讲诚信,负责任的原则,为您进行细心、贴心、认真的服务,与众多客户在蓬勃发展的市场环境中,互促共生。

背景原因

目前由双牛掌柜为主导框架开发的一系列产品中,网络请求框架请求到的数据是默认解析成Model类的。即项目中不会手动去解析网络请求到的json数据。在项目中,使用封装好的框架自动解析成Model类。而且Model类使用JsonFormat工具生成,所以在项目的开发中,不会或者说是减少了由于手误而打错了字段问题。

项目对网络处理的繁琐过程进行了高度封装。但是封装的框架是基于后台数据格式不会改变的情况,一旦后天返回的数据产生了变化,网络解析就会发生错误。

问题产生位置

所有设计到微信和支付宝两种支付方式共存的地方。

分析

当请求接口时支付宝返回的json如下(隐私数据已隐藏):

{
  "status": 1,
  "msg": "支付宝支付所需数据",
  "result": "**************此处时吊起支付宝的数据,不做展示****************"
}

微信返回的json数据如下(隐私数据已隐藏):

{
  "status": 1,
  "msg": "微信支付所需数据",
  "result": {
    "appid": "************",
    "partnerid": "************",
    "prepayid": "************",
    "package": "Sign=WXPay",
    "noncestr": "************",
    "timestamp": 1532915535,
    "sign": "************"
  }
}

调起微信或支付宝的数据位于result字段的数据中。根据上面两种不同的格式,清楚的发现这是两种不同的格式,一个是字符串,一个是键值对对象。这种情况在双牛掌柜网络请求框架中目前是不存在解析方式的。所以要给出一种简便可复用的解决方案。

解决方案

双牛掌柜框架中,支付流程过程高度封装,对于不同的项目只需修改微信的appid。即使涉及到逻辑变动,支付流程变动也不会很大,或者压根不会变动。

1.双牛掌柜支付流程如下(余额支付没举例,但是已封装)

Android如何解析相同接口返回不同格式json数据

双牛掌柜支付过程.png

在项目实际使用的过程中,只需复写网络请求获取信息,和回调支付这两个地方,因为不同的支付位置会使用不同的支付接口,接口会变。其他的地方不会发生变化。

解决方案一

接口返回不同数据这个问题很早就出现了,当时由于项目紧张,采取了一个接口根据返回数据的不同,分成了两个接口;在进行逻辑处理的时候,手动判断调用对应的接口。但是这种实现的方式过于繁琐,所有的逻辑过程都要考虑清楚,代码编写的过程中不停的造轮子。

写两套接口,意味着如流程图所示的流程会走两遍,加大了代码的复杂度。

此处不做代码展示。

解决方案二

第二种方式的核心思想是代码解耦合。由于之前网络请求框架高度封装,所以整体上是高内聚低耦合,但是如果想对网络请求框架进行自定义,又必须姐耦合,这就是编程中的矛盾点。

1.手动解析json数据,让框架不在解析。

此处操作乍一看挺复杂,但是实际操作的过程中并不是很复杂。将接口返回数据的泛型替换成ResponseBody就可以获取到未解析的数据了。代码如下:

 /**
   * 我要买单
   *
   * @param payCode
   * @param zflx  1扫码买单 2附近商家我要买单 3商家报单 4充值 5升级 6商城消费
   */
  @FormUrlEncoded
  @POST("Near/wymd")
  Observable wymd(
      @Field("snzg_user_id") String userId,
      @Field("shop_user_id") String shopUserId,
      @Field("money") String money,
      @Field("bd_id") String bdId,
      @Field("pay_code") int payCode,
      @Field("zflx") int zflx
  );

当请求到数据时,把数据转成String格式,就可以对数据记性拆箱操作了。代码如下:

 @Override
 public void handleSuccess(Object result) {
    toPay(result.toString(), wymd.getPaycode());
 }

然后再使用Gson解析工具,将json转换成对象。

  protected void toPay(String payInfo, int payCode) {
    
    //余额
    if (payCode == 3) {
      payEnd("支付成功");
    }
    
    //微信
    if (payCode == 2) {
      wxPayResult = GsonUtil.parseJsonWithGson(payInfo, WxPayResult.class);
      weChatPay();
    }
    
    //支付宝
    if (payCode == 1) {
      alipay(payInfo);
    }

  }

至此问题已解决。

以上是“Android如何解析相同接口返回不同格式json数据”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


网站栏目:Android如何解析相同接口返回不同格式json数据
文章路径:http://myzitong.com/article/gjodeg.html