溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android如何解析相同接口返回不同格式json數據

發布時間:2021-08-07 13:11:53 來源:億速云 閱讀:467 作者:小新 欄目:移動開發

這篇文章主要為大家展示了“Android如何解析相同接口返回不同格式json數據”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“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.雙牛掌柜支付流程如下(余額支付沒舉例,但是已封裝)

Android如何解析相同接口返回不同格式json數據

雙牛掌柜支付過程.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);
    }

  }

至此問題已解決。

以上是“Android如何解析相同接口返回不同格式json數據”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女