重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要为大家展示了“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.双牛掌柜支付流程如下(余额支付没举例,但是已封装)
双牛掌柜支付过程.png
在项目实际使用的过程中,只需复写网络请求获取信息,和回调支付这两个地方,因为不同的支付位置会使用不同的支付接口,接口会变。其他的地方不会发生变化。
解决方案一
接口返回不同数据这个问题很早就出现了,当时由于项目紧张,采取了一个接口根据返回数据的不同,分成了两个接口;在进行逻辑处理的时候,手动判断调用对应的接口。但是这种实现的方式过于繁琐,所有的逻辑过程都要考虑清楚,代码编写的过程中不停的造轮子。
写两套接口,意味着如流程图所示的流程会走两遍,加大了代码的复杂度。
此处不做代码展示。
解决方案二
第二种方式的核心思想是代码解耦合。由于之前网络请求框架高度封装,所以整体上是高内聚低耦合,但是如果想对网络请求框架进行自定义,又必须姐耦合,这就是编程中的矛盾点。
1.手动解析json数据,让框架不在解析。
此处操作乍一看挺复杂,但是实际操作的过程中并不是很复杂。将接口返回数据的泛型替换成ResponseBody就可以获取到未解析的数据了。代码如下:
/** * 我要买单 * * @param payCode * @param zflx 1扫码买单 2附近商家我要买单 3商家报单 4充值 5升级 6商城消费 */ @FormUrlEncoded @POST("Near/wymd") Observablewymd( @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数据”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!