三分钟教你学会Retrofit解析JSON

在Retrofit的使用中,有两种方法进行拼接和解析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%3A43%3A19&index=1


同样需要注意的是如果你是直接使用的话,可以不拼接字符串,直接在接口RetrofitService的@GET()里面填写就可以的,具体的可以参考我下面的写的代码。

1.如果对于我而言,我只需要json字符串直接的显示,不需要动态的改变后面拼接参数的值得大小的话。

可以有以下代码:在接口RetrofitService

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<Shop> 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<Shop>() {
            @Override
            public void onResponse(Call<Shop> call, Response<Shop> response) {
                 
Toast.makeText(Activity().this,"下载失败",Toast.LENGTH_LONG).show();
//然后就可以在里面具体获得需要的额list,然后适配到适配器,更新UI就OK了。
            }

            @Override
            public void onFailure(Call<Shop> call, Throwable t) {
                
Toast.makeText(Activity().this,"下载失败",Toast.LENGTH_LONG).show();
                Log.i("tag","-----"+t.getMessage());//打印错误日志
            }
        });
    }




 
 

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

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

public interface RetrofitService {

//使用一个QueryMap,创建一个 Map<String,String> 前面一个String代表的是:拼接字符串的名字,后面一个则是字符串的具体值,如果没有值则用""代替。

看到这你也许有点疑惑的是,@GET(UrlConfig.Path.SHOP_URL)是啥?一脸懵逼

这个就是我说的用第二种方法,漂亮规范的写代码,封装字符串。所以,创建一个类,专门用来存储JSON的值:

  @GET(UrlConfig.Path.SHOP_URL) //JSON字符中baseUrl的后面,?前面的字符 

		//定义一个call,回调方法,在获得Call对象的时候,传入拼接?(问号)后面的字符串的值。有点绕口其实就是在fragment/activity类中这句话: call=myRetrofitService.getShopData(params);其中params已经拼接了字符串,所以需要回调传入值。

    Call<Shop> getShopData( @QueryMap Map<String,String> 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<Shop>() {
            @Override
            public void onResponse(Call<Shop> call, Response<Shop> response) {
                 
Toast.makeText(Activity().this,"下载失败",Toast.LENGTH_LONG).show();
//然后就可以在里面具体获得需要的额list,然后适配到适配器,更新UI就OK了。
            }

            @Override
            public void onFailure(Call<Shop> call, Throwable t) {
                
Toast.makeText(Activity().this,"下载失败",Toast.LENGTH_LONG).show();
                Log.i("tag","-----"+t.getMessage());//打印错误日志
            }
        });
    }


 

基本使用也就是这么回事了,非常简单易懂不是吗?有问题的话直接留言哦~ 




  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以使用 Retrofit 来提交 JSON 格式的数据。首先,你需要创建一个 Java 来定义你要提交的 JSON 数据的结构。然后,你可以使用 Retrofit 的注解来定义请求的方式和路径,以及指定请求体的内容型为 JSON。最后,你可以调用 Retrofit 的方法来发送请求。 下面是一个示例: 首先,定义一个 Java 来表示要提交的 JSON 数据的结构,比如一个用户信息: ```java public class User { private String name; private String email; public User(String name, String email) { this.name = name; this.email = email; } } ``` 接下来,在 Retrofit 的 API 接口中定义请求的方式、路径和请求体的内容型。使用 `@Body` 注解来指定请求体为 JSON 格式: ```java public interface ApiService { @POST("users") Call<Void> createUser(@Body User user); } ``` 然后,创建 Retrofit 实例并构建 API 接口的实现: ```java Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); ``` 最后,调用 API 接口的方法来发送请求: ```java User user = new User("John Doe", "john.doe@example.com"); Call<Void> call = apiService.createUser(user); call.enqueue(new Callback<Void>() { @Override public void onResponse(Call<Void> call, Response<Void> response) { // 请求成功处理 } @Override public void onFailure(Call<Void> call, Throwable t) { // 请求失败处理 } }); ``` 这样,你就可以使用 Retrofit 来提交 JSON 格式的数据了。记得替换示例中的 URL 和路径为你实际的接口地址和路径。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值