3分でRetrofit解析JSONを教えます
Retrofitの使用には、JSON文字列の結合と解析の2つの方法があります.
JSONの文字列がこんなに長い場合:
では、Retrofitを使うと、文字列をつづるのが面倒だと感じます.分割の法則は以下の通りです.
1.基本的なURLアドレスの一部:
http://www.syby8.com/
注意しなければならないのは、後に必ず/と可変にする必要はありません.具体的には、この図を参照してください.
RetrofitインタフェースのURLの定義方法:
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文字列の直接的な表示だけが必要で、後の接合パラメータの値の大きさを動的に変更する必要はありません.
次のコードがあります.
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の定義方法:
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());// } }); } --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二种就是不是这么暴露,嘿嘿,直接封装的好一点,而且不是这种不规范的野蛮的字符串的拼接方式了,在上面我已经讲了我拼接字符串的规律了,所以具体参考我如下的代码:
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"; } }
有种吐血的感觉,似不似,厉害了我的哥! 没办法,谁让字符串这么的多,所以我手动拼接,花了我半条老命!
在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());// } }); }
基本的に使うということで、とても分かりやすいのではないでしょうか.質問があれば直接メッセージを送りますよ~