Android解析相同接口返回不同格式json数据的方法

背景原因

目前由双牛掌柜为主导框架开发的一系列产品中,网络请求框架请求到的数据是默认解析成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.双牛掌柜支付流程如下(余额支付没举例,但是已封装)

双牛掌柜支付过程.png

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

解决方案一

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

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

此处不做代码展示。

解决方案二

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

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

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

 /**
   * 我要买单
   *
   * @param payCode
   * @param zflx  1扫码买单 2附近商家我要买单 3商家报单 4充值 5升级 6商城消费
   */
  @FormUrlEncoded
  @POST("Near/wymd")
  Observable<ResponseBody> 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);
    }

  }

至此问题已解决。

总结

代码高度封装带来编程的便利,但是对于一些变数也会产生一些难以解决的问题。这就需要在代码编写之前就要对整理进行一个分析,分析一定要全面,而且代码一定要可扩展,不能写死,不能让某种变数导致框架不能使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 媒体开发之MediaPlayer状态机接口方法实例解析

    一. MediaPlayer 状态机 介绍 Android MediaPlayer 状态即图例 : 1. Idle (闲置) 状态 和 End (结束) 状态 MediaPlayer 对象声明周期 : 从 Idle 到 End 状态就是 MediaPlayer 整个生命周期; -- 生命周期开始 : 进入 Idle (闲置) 状态; -- 生命周期结束 : 进入 End (结束) 状态; Idle 和 End 状态转换 : -- 进入 Idle 状态 : MediaPlayer 刚被创建 new

  • android post请求接口demo

    本文实例为大家分享了android post请求接口demo测试代码,供大家参考,具体内容如下 MainActivity.java package com.tsh.test; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; import android.app.Ac

  • Android studio无法创建类和接口和提示问题的完美解决办法

    这就很尴尬了,到底是哪里出了问题,根据template报错,打开file->setting->file and templates 发现里边的templates 全部是空的,class没有模板,我就从别人那里考了一份出来粘贴上,发现可以新建类了,ok,问题得到解决. 但是过几天发现又出问题了,再次打开studio,发现templates又空了,总不能每次开IDE都重新复制一次 最终的解决办法如下: 打开studio所在的文件夹(在这之前请关闭studio), 在bin文件夹下找到这个文件stu

  • Android Parcelable接口使用方法详解

     Android Parcelable接口使用方法详解 1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementin

  • Android应用中使用及实现系统“分享”接口实例

    为了应用的推广.传播,很多的应用中都有"分享"功能,一个按钮,点击后会出现短信.微博等等一切实现了分享功能的应用列表.这一篇文章主要介绍怎么调用分享功能和怎么实现分享接口让自己应用出现分享列表中.Android应用中能很方便的完成这些功能,这也正是Android的伟大之处,他能很简单的完成应用之间的沟通以相互整合. 调用分享功能 1.分享文本 分享功能使用的隐式启动Activity的方法,这里的Action使用的是 ACTION_SEND. Intent sendIntent = ne

  • Android源码中常用的接口传参实例详解

    Android源码中常用的接口传参实例详解 把MyCclass中的参数传到MyDclass /*接口传参例子2 * MyCclass.java发送MyDclass.java接收 * 原理和MyAclass.java发送MyDclass.java接收完全一样 * */ public class MyCclass { public void getEditext(GetMyFragmentData myFragmentData){ String edStr="人的生命是有限的,可是为人民服务是无限的

  • 详解Android中接口回调、方法回调

    在Android开发中我们很多地方都用到了方法的回调,回调就是把方法的定义和功能导入实现分开的一种机制,目的是为了解耦他的本质是基于观察者设计模式,即观察者设计模式的的简化版,例如:在下载时候的进度回调,在adapter与activity之间的回调,在javabean和fragment以及fragment之间的回调等等,回调的目的主要有两个:其一是传递数据,其二是保持数据的同步更新.常用的有两种形式,一是使用内部类的形式,得到接口的子类对象,另一种是直接实现定义的接口. 一.内部类的形式 1.在

  • android调用webservice接口获取信息

    我的有一篇博客上讲了如何基于CXF搭建webservice,service层的接口会被部署到tomcat上,这一篇我就讲一下如何在安卓中调用这些接口传递参数. 1.在lib中放入ksoap2的jar包并导入 2.在xml 配置文件中加入: <!-- 访问网络的权限 --> <uses-permission android:name="android.permission.INTERNET" /> 3.接下来就要通过代码调用借口了 String WSDL_URI

  • Android 8.0的缓存大小和缓存清理接口方法

    获取缓存大小接口 主要这里的方法已经和7.0不兼容了. import android.app.usage.UsageStats; import android.app.usage.UsageStatsManager; import android.content.Context; import android.content.pm.PackageManager; import android.os.Process; import android.os.storage.StorageManager

  • Android解析相同接口返回不同格式json数据的方法

    背景原因 目前由双牛掌柜为主导框架开发的一系列产品中,网络请求框架请求到的数据是默认解析成Model类的.即项目中不会手动去解析网络请求到的json数据.在项目中,使用封装好的框架自动解析成Model类.而且Model类使用JsonFormat工具生成,所以在项目的开发中,不会或者说是减少了由于手误而打错了字段问题. 项目对网络处理的繁琐过程进行了高度封装.但是封装的框架是基于后台数据格式不会改变的情况,一旦后天返回的数据产生了变化,网络解析就会发生错误. 问题产生位置 所有设计到微信和支付宝两

  • Java后台返回和处理JSon数据的方法步骤

    1.下载JsonObject相关jar包 在这里,我们使用JsonObject来将Java类型数据转换成Json类型,首先要下载该库相关的jar包,下载地址如下: https://www.jb51.net/softs/615024.html 2.JsonObject的使用代码示例 JSONObject jsonObject = new JSONObject(); //创建Json对象 jsonObject.put("username", "张三"); //设置Jso

  • .NetCore Web Api 利用ActionFilterAttribute统一接口返回值格式及问题解析

    .Net Core 同 Asp.Net MVC一样有几种过滤器,这里不再赘述每个过滤器的执行顺序与作用. 在实际项目开发过程中,统一API返回值格式对前端或第三方调用将是非常必要的,在.NetCore中我们可以通过ActionFilterAttribute来进行统一返回值的封装. 在封装之前我们需要考虑下面几个问题: 1,需要对哪些结果进行封装 我目前的做法是,只对ObjectResult进行封装,其他的类型:FileResult,ContentResult,EmptyResult,Redire

  • ajax调用返回php接口返回json数据的方法(必看篇)

    php代码如下: <?php header('Content-Type: application/json'); header('Content-Type: text/html;charset=utf-8'); $email = $_GET['email']; $user = []; $conn = @mysql_connect("localhost","Test","123456") or die("Failed in conn

  • Android解析JSON数据的方法分析

    本文实例讲述了Android解析JSON数据的方法.分享给大家供大家参考,具体如下: JSON作为一种"轻量"的数据结构传递数据,在JS中有广泛的应用 Google公司对JSON的解析提供了gson.jar这个包,它不依赖于其他任何JAR包:自从Android3.0中已经合入了该解析器的功能,但之前的版本是没有的. findViewById(R.id.parseBtn).setOnClickListener(new OnClickListener(){ @Override public

  • springboot实现FastJson解析json数据的方法

    最近在研究springboot实现FastJson解析json数据的方法,那么今天也算个学习笔记吧! 添加jar包: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.15</version> </dependency> 两种方式启动加载类: 第一种继承WebMvcConfigur

  • Android实现读写JSON数据的方法

    本文实例讲述了Android实现读写JSON数据的方法.分享给大家供大家参考.具体如下: 1. 解析JSON: package de.vogella.android.twitter.json; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpEntit

  • python和flask中返回JSON数据的方法

    在python中可以使用json将数据格式化为JSON格式: 1.将字典转换成JSON数据格式: s=['张三','年龄','姓名'] t={} t['data']=s return json.dumps(t,ensure_ascii=False) 2.将列表转换成JSON数据格式: s=['张三','年龄','姓名'] return json.dumps(s,ensure_ascii=False) 使用json转换的在前端显示的数据为JSON字符串. 使用flask的jsonify转换后,在前

  • 基于Android引入IjkPlayer无法播放mkv格式视频的解决方法

    写在前面 项目中直接引用或者直接编译源码得到的ijkplayer在播放mkv文件时出现(-10000)的错误,去项目github查看了才知道,默认是不支持mkv和rmvb格式视频的播放的. 用了一天时间解决(为什么用了一天,因为我蠢啊),这里记录一下解决的方法(官方上面其实已经有了详细的教程,无奈我当时没有很认真看.)这里为我自己这个新手做个记录: 仍然是采用编译源码的方式引入,只是需要按照官方的方法更改一下脚本文件 ijkplayer官方地址:https://github.com/Bilibi

  • java 通过发送json,post请求,返回json数据的方法

    实例如下所示: import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import org.json.JSONArray; impo

随机推荐