3分でRetrofit解析JSONを教えます

10685 ワード

Retrofitの使用には、JSON文字列の結合と解析の2つの方法があります.
JSONの文字列がこんなに長い場合:
http://www.syby8.com/apptools/productlist.aspx?act=getproductlist&v=34&pages=1&bc=0&sc=0&sorts=&channel=0&ckey=&daynews=&lprice=0&hprice=0&tbclass=0&actid=0&brandid=0&predate=2016-08-28+17%3A43%3A19&index=1

では、Retrofitを使うと、文字列をつづるのが面倒だと感じます.分割の法則は以下の通りです.
1.基本的なURLアドレスの一部:
http://www.syby8.com/ 
注意しなければならないのは、後に必ず/と可変にする必要はありません.具体的には、この図を参照してください.
RetrofitインタフェースのURLの定義方法:
三分钟教你学会Retrofit解析JSON_第1张图片
2.ネットワーク要求のURLアドレスの一部:
apptools/productlist.aspx?
3.?(疑問符)後のつづり文字列のURLアドレス:act=getproductlist&v=34&pages=1&bc=0&sc=0&sorts=&channel=0&ckey=&daynews=&lprice=0&hprice=0&tbclass=0&actid=0&brandid=0&predate=2016-08-28+17%3 A 43%3 A 19&index=1
同様に注意が必要なのは、あなたが直接使用する場合、文字列をつなぎ合わせずに、インターフェースRetrofitServiceの@GET()に直接記入すればいいので、具体的には私の下に書いたコードを参考にしてください.
1.私にとって、json文字列の直接的な表示だけが必要で、後の接合パラメータの値の大きさを動的に変更する必要はありません.
次のコードがあります.
public interface RetrofitService {

  @GET("apptools/productlist.aspx?act=getproductlist&v=34&pages=1&bc=0&sc=0&sorts=&channel=0&ckey=&daynews=&lprice=0&hprice=0&tbclass=0&actid=0&brandid=0&predate=2016-08-28+17%3A43%3A19&index=1")

//    call,    ,。
  Call getShopData();

}
 
  

而在网络请求端,也是activity/fragment类中,有方法如下:

额外需要提一句的就是,利用retrofit进行网络访问和解析的步骤,标准的按照如下5步来你就绝对不会错!:

1.定义一个接口(封装URL地址和数据请求)

2.实例化Retrofit

3.通过retrofit实例创建接口服务对象

4.接口服务对象调用接口中方法,获得Call对象

5.Call对象执行请求(异步、同步)

-----  来来来,我们来分析一下,定义一个接口,封装URL地址和数据请求,瞧瞧,我已经有先见之明使用了,哈哈。

fragment/activity类中: 

private void initRetrofit() {

//   retrofit 

        Retrofit retrofit=new Retrofit
                .Builder()
                .baseUrl(http://www.syby8.com/)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

//  retrofit          
        RetrofitService myRetrofitService=retrofit.create(RetrofitService.class);

             ,  Call  
        call=myRetrofitService.getShopData();

Call      (  、  )
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                 
Toast.makeText(Activity().this,"    ",Toast.LENGTH_LONG).show();
//                list,        ,  UI OK 。
            }

            @Override
            public void onFailure(Call call, Throwable t) {
                
Toast.makeText(Activity().this,"    ",Toast.LENGTH_LONG).show();
                Log.i("tag","-----"+t.getMessage());//      
            }
        });
    }
 
  三分钟教你学会Retrofit解析JSON_第2张图片 
  

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第二种就是不是这么暴露,嘿嘿,直接封装的好一点,而且不是这种不规范的野蛮的字符串的拼接方式了,在上面我已经讲了我拼接字符串的规律了,所以具体参考我如下的代码:

public interface RetrofitService {

//    QueryMap,     Map     String    :        ,             ,       ""  。

            ,@GET(UrlConfig.Path.SHOP_URL)  ?    

             ,        ,     。  ,     ,      JSON  :

  @GET(UrlConfig.Path.SHOP_URL) //JSON   baseUrl   ,?      

		//    call,    ,   Call     ,    ?(  )        。         fragment/activity     : call=myRetrofitService.getShopData(params);  params        ,         。

    Call getShopData( @QueryMap Map params)

}

作成
パッケージクラス:
public class UrlConfig {
 public static class Path{

  //JSON    
  //http://www.syby8.com/
  // apptools/productlist.aspx?
  // act=getproductlist&v=34&pages=1
  // &bc=0&sc=0&sorts=&channel=0&ckey=
  // &daynews=&lprice=0&hprice=0&tbclass=0
  // &actid=0&brandid=0&predate=2016-08-28+17%3A43%3A19&index=1

  public  static  final  String SHOP_BASEURL="http://www.syby8.com/";

  public static final String SHOP_URL="apptools/productlist.aspx?";

 }
 public static class key{
  //JSON          
  public static final String ACT="act";
  public static final String V="v";
  public static final String PAGES="pages";
  public static final String BC="bc";
  public static final String SC="sc";
  public static final String SORTS="sorts";
  public static final String CHANNEL="channel";
  public static final String CKEY="ckey";
  public static final String DAYNEWS="daynews";
  public static final String LPRICE="lprice";
  public static final String HPRICE="hprice";
  public static final String TBCLASS="tbclass";
  public static final String ACTID="actid";
  public static final String BRANDID="brandid";
  public static final String PREDITE="predate";
  public static final String INDEX="index";
 }

//JSON            
 public static class DefaultValue{
  public static final String ACT="getproductlist";
  public static final String V="34";
  public static final String PAGES="1";
  public static final String BC="0";
  public static final String SC="0";
  public static final String SORTS="";
  public static final String CHANNEL="0";
  public static final String CKEY="";
  public static final String DAYNEWS="";
  public static final String LPRICE="0";
  public static final String HPRICE="0";
  public static final String TBCLASS="0";
  public static final String ACTID="0";
  public static final String BRANDID="0";
  public static final String PREDITE="2016-08-28+17%3A43%3A19";
  public static final String INDEX="1";

 }
}
 
  

有种吐血的感觉,似不似,厉害了我的哥! 没办法,谁让字符串这么的多,所以我手动拼接,花了我半条老命!

三分钟教你学会Retrofit解析JSON_第3张图片

在fragment/activity类中:

//     :

params.put(UrlConfig.key.ACT,UrlConfig.DefaultValue.ACT);
        params.put(UrlConfig.key.V,UrlConfig.DefaultValue.V);
        params.put(UrlConfig.key.PAGES,UrlConfig.DefaultValue.PAGES);
        params.put(UrlConfig.key.BC,UrlConfig.DefaultValue.BC);
        params.put(UrlConfig.key.SC,UrlConfig.DefaultValue.SC);
        params.put(UrlConfig.key.SORTS,UrlConfig.DefaultValue.SORTS);
        params.put(UrlConfig.key.CHANNEL,UrlConfig.DefaultValue.CHANNEL);
        params.put(UrlConfig.key.CKEY,UrlConfig.DefaultValue.CKEY);
        params.put(UrlConfig.key.DAYNEWS,UrlConfig.DefaultValue.DAYNEWS);
        params.put(UrlConfig.key.LPRICE,UrlConfig.DefaultValue.LPRICE);
        params.put(UrlConfig.key.HPRICE,UrlConfig.DefaultValue.HPRICE);
        params.put(UrlConfig.key.TBCLASS,UrlConfig.DefaultValue.TBCLASS);
        params.put(UrlConfig.key.ACTID,UrlConfig.DefaultValue.ACTID);
        params.put(UrlConfig.key.BRANDID,UrlConfig.DefaultValue.BRANDID);
        params.put(UrlConfig.key.PREDITE,UrlConfig.DefaultValue.PREDITE);
        params.put(UrlConfig.key.INDEX,UrlConfig.DefaultValue.INDEX);


private void initRetrofit() {

//   retrofit 

        Retrofit retrofit=new Retrofit
                .Builder()
                .baseUrl(UrlConfig.Path.SHOP_BASEURL) 
                .addConverterFactory(GsonConverterFactory.create()) //       gson    json   
                .build();

//  retrofit          
        RetrofitService myRetrofitService=retrofit.create(RetrofitService.class);

             ,  Call  
        call=myRetrofitService.getShopData(params);  params,     ~

Call      (  、  )
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                 
Toast.makeText(Activity().this,"    ",Toast.LENGTH_LONG).show();
//                list,        ,  UI OK 。
            }

            @Override
            public void onFailure(Call call, Throwable t) {
                
Toast.makeText(Activity().this,"    ",Toast.LENGTH_LONG).show();
                Log.i("tag","-----"+t.getMessage());//      
            }
        });
    }

基本的に使うということで、とても分かりやすいのではないでしょうか.質問があれば直接メッセージを送りますよ~
三分钟教你学会Retrofit解析JSON_第4张图片