最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android解析相同接口返回不同格式j(luò)son數(shù)據(jù)的方法

 更新時(shí)間:2018年08月02日 14:52:11   作者:時(shí)間在走  
這篇文章主要介紹了Android解析相同接口返回不同格式j(luò)son數(shù)據(jù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

背景原因

目前由雙牛掌柜為主導(dǎo)框架開發(fā)的一系列產(chǎn)品中,網(wǎng)絡(luò)請求框架請求到的數(shù)據(jù)是默認(rèn)解析成Model類的。即項(xiàng)目中不會手動去解析網(wǎng)絡(luò)請求到的json數(shù)據(jù)。在項(xiàng)目中,使用封裝好的框架自動解析成Model類。而且Model類使用JsonFormat工具生成,所以在項(xiàng)目的開發(fā)中,不會或者說是減少了由于手誤而打錯了字段問題。

項(xiàng)目對網(wǎng)絡(luò)處理的繁瑣過程進(jìn)行了高度封裝。但是封裝的框架是基于后臺數(shù)據(jù)格式不會改變的情況,一旦后天返回的數(shù)據(jù)產(chǎn)生了變化,網(wǎng)絡(luò)解析就會發(fā)生錯誤。

問題產(chǎn)生位置

所有設(shè)計(jì)到微信和支付寶兩種支付方式共存的地方。

分析

當(dāng)請求接口時(shí)支付寶返回的json如下(隱私數(shù)據(jù)已隱藏):

{
  "status": 1,
  "msg": "支付寶支付所需數(shù)據(jù)",
  "result": "**************此處時(shí)吊起支付寶的數(shù)據(jù),不做展示****************"
}

微信返回的json數(shù)據(jù)如下(隱私數(shù)據(jù)已隱藏):

{
  "status": 1,
  "msg": "微信支付所需數(shù)據(jù)",
  "result": {
    "appid": "************",
    "partnerid": "************",
    "prepayid": "************",
    "package": "Sign=WXPay",
    "noncestr": "************",
    "timestamp": 1532915535,
    "sign": "************"
  }
}

調(diào)起微信或支付寶的數(shù)據(jù)位于result字段的數(shù)據(jù)中。根據(jù)上面兩種不同的格式,清楚的發(fā)現(xiàn)這是兩種不同的格式,一個是字符串,一個是鍵值對對象。這種情況在雙牛掌柜網(wǎng)絡(luò)請求框架中目前是不存在解析方式的。所以要給出一種簡便可復(fù)用的解決方案。

解決方案

雙牛掌柜框架中,支付流程過程高度封裝,對于不同的項(xiàng)目只需修改微信的appid。即使涉及到邏輯變動,支付流程變動也不會很大,或者壓根不會變動。

1.雙牛掌柜支付流程如下(余額支付沒舉例,但是已封裝)

雙牛掌柜支付過程.png

在項(xiàng)目實(shí)際使用的過程中,只需復(fù)寫網(wǎng)絡(luò)請求獲取信息,和回調(diào)支付這兩個地方,因?yàn)椴煌闹Ц段恢脮褂貌煌闹Ц督涌?,接口會變。其他的地方不會發(fā)生變化。

解決方案一

接口返回不同數(shù)據(jù)這個問題很早就出現(xiàn)了,當(dāng)時(shí)由于項(xiàng)目緊張,采取了一個接口根據(jù)返回?cái)?shù)據(jù)的不同,分成了兩個接口;在進(jìn)行邏輯處理的時(shí)候,手動判斷調(diào)用對應(yīng)的接口。但是這種實(shí)現(xiàn)的方式過于繁瑣,所有的邏輯過程都要考慮清楚,代碼編寫的過程中不停的造輪子。

寫兩套接口,意味著如流程圖所示的流程會走兩遍,加大了代碼的復(fù)雜度。

此處不做代碼展示。

解決方案二

第二種方式的核心思想是代碼解耦合。由于之前網(wǎng)絡(luò)請求框架高度封裝,所以整體上是高內(nèi)聚低耦合,但是如果想對網(wǎng)絡(luò)請求框架進(jìn)行自定義,又必須姐耦合,這就是編程中的矛盾點(diǎn)。

1.手動解析json數(shù)據(jù),讓框架不在解析。

此處操作乍一看挺復(fù)雜,但是實(shí)際操作的過程中并不是很復(fù)雜。將接口返回?cái)?shù)據(jù)的泛型替換成ResponseBody就可以獲取到未解析的數(shù)據(jù)了。代碼如下:

 /**
   * 我要買單
   *
   * @param payCode
   * @param zflx  1掃碼買單 2附近商家我要買單 3商家報(bào)單 4充值 5升級 6商城消費(fèi)
   */
  @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
  );

當(dāng)請求到數(shù)據(jù)時(shí),把數(shù)據(jù)轉(zhuǎn)成String格式,就可以對數(shù)據(jù)記性拆箱操作了。代碼如下:

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

然后再使用Gson解析工具,將json轉(zhuǎn)換成對象。

  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);
    }

  }

至此問題已解決。

總結(jié)

代碼高度封裝帶來編程的便利,但是對于一些變數(shù)也會產(chǎn)生一些難以解決的問題。這就需要在代碼編寫之前就要對整理進(jìn)行一個分析,分析一定要全面,而且代碼一定要可擴(kuò)展,不能寫死,不能讓某種變數(shù)導(dǎo)致框架不能使用。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android 設(shè)置Edittext獲取焦點(diǎn)并彈出軟鍵盤

    Android 設(shè)置Edittext獲取焦點(diǎn)并彈出軟鍵盤

    本文主要介紹了Android設(shè)置Edittext獲取焦點(diǎn)并彈出軟鍵盤的實(shí)現(xiàn)代碼。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-04-04
  • Android編程實(shí)現(xiàn)簡單文件瀏覽器功能

    Android編程實(shí)現(xiàn)簡單文件瀏覽器功能

    這篇文章主要介紹了Android編程實(shí)現(xiàn)簡單文件瀏覽器功能,結(jié)合實(shí)例形式分析了Android文件管理器的布局、文件與目錄的遍歷、權(quán)限控制等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Android開發(fā)中ProgressDialog簡單用法示例

    Android開發(fā)中ProgressDialog簡單用法示例

    這篇文章主要介紹了Android開發(fā)中ProgressDialog簡單用法,結(jié)合實(shí)例形式分析了Android使用ProgressDialog的進(jìn)度條顯示與關(guān)閉、更新等事件響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Android編程實(shí)現(xiàn)調(diào)用相冊、相機(jī)及拍照后直接裁剪的方法

    Android編程實(shí)現(xiàn)調(diào)用相冊、相機(jī)及拍照后直接裁剪的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)調(diào)用相冊、相機(jī)及拍照后直接裁剪的方法,涉及Android拍照及圖形處理相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • Android Activity 與Service進(jìn)行數(shù)據(jù)交互詳解

    Android Activity 與Service進(jìn)行數(shù)據(jù)交互詳解

    這篇文章主要介紹了Android Activity 與Service進(jìn)行數(shù)據(jù)交互的相關(guān)資料,在開發(fā)Android App的時(shí)候經(jīng)常會使用這樣的功能,需要的朋友可以參考下
    2016-10-10
  • Android 實(shí)現(xiàn)自定義圓形進(jìn)度條的功能

    Android 實(shí)現(xiàn)自定義圓形進(jìn)度條的功能

    這篇文章主要介紹了Android 實(shí)現(xiàn)自定義圓形進(jìn)度條的功能的相關(guān)資料,開發(fā)Android應(yīng)用的朋友肯定對自定義View不陌生,很多都有重新寫的,這里就對實(shí)現(xiàn)圓形進(jìn)度條介紹下,需要的朋友可以參考下
    2016-11-11
  • Android實(shí)現(xiàn)帶有刪除按鈕的EditText示例代碼

    Android實(shí)現(xiàn)帶有刪除按鈕的EditText示例代碼

    本文給大家介紹一個很實(shí)用的小控件,就是在Android系統(tǒng)的輸入框右邊加入一個小圖標(biāo),點(diǎn)擊小圖標(biāo)可以清除輸入框里面的內(nèi)容,IOS上面直接設(shè)置某個屬性就可以實(shí)現(xiàn)這一功能,但是Android原生EditText不具備此功能,所以要想實(shí)現(xiàn)這一功能我們需要重寫EditText。下面來看看吧。
    2016-12-12
  • 深入AndroidManifest.xml文件解析詳解

    深入AndroidManifest.xml文件解析詳解

    AndroidManifest.xml是每個android程序中必須的文件。它位于整個項(xiàng)目的根目錄,描述了package中暴露的組件(activities,services,等等),他們各自的實(shí)現(xiàn)類,各種能被處理的數(shù)據(jù)和啟動位置
    2013-05-05
  • Android中文件讀寫(輸入流和輸出流)操作小結(jié)

    Android中文件讀寫(輸入流和輸出流)操作小結(jié)

    這篇文章主要介紹了Android中文件讀寫(輸入流和輸出流)操作小結(jié),本文總結(jié)了Android中文件讀寫的原理、字節(jié)流和字符流的區(qū)別、文件讀寫的步驟、輸入流和輸出流以及代碼實(shí)例等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • android實(shí)現(xiàn)拖拽裁剪功能

    android實(shí)現(xiàn)拖拽裁剪功能

    這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)拖拽裁剪功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評論

岐山县| 民乐县| 霍州市| 济源市| 武隆县| 长岭县| 兴海县| 台东县| 哈巴河县| 康保县| 成安县| 泽州县| 申扎县| 舞钢市| 建平县| 九龙县| 天等县| 琼中| 湘乡市| 安远县| 若尔盖县| 永春县| 台前县| 靖远县| 东明县| 三原县| 沾益县| 奉贤区| 兴海县| 雷山县| 金阳县| 鹤山市| 美姑县| 紫金县| 钟祥市| 钟山县| 定安县| 余姚市| 抚松县| 瓦房店市| 侯马市|