okhttp接收Json数据并且用Gson解析

5,427 阅读3分钟

一、准备工作

首先把三个和OKhttp请求有关的jar包下载下来并放到工程的libs目录下,下载地址:pan.baidu.com/s/1GhrEeHqi…

二、具体使用方式

1.原始的使用方式

把jar包添加到工程目录后,把下面的httpRequest()复制到Activity中并调用即可。 String date = response.body().string();为获取到的json数据,Constant.SPLASH_URL参数为所要请求数据的URL

  public void  httpRequest(){
        final OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url(Constant.SPLASH_URL)
                .build();

        //开启一个异步请求
        client.newCall(request).enqueue(new Callback() {

            //请求失败
            @Override public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            //有响应
            @Override public void onResponse(Call call, Response response) throws IOException {
                if(!response.isSuccessful()) {
                    //请求失败
                }

                //获取到接口的数据
                String date = response.body().string();
                //把数据解析,这里的Ads为我们所需要的javaBean对象
                Ads ads =  JsonUtil.parseJson(date, Ads.class);

    }

解析json数据用到的JsonUtil类

public class JsonUtil {
   static Gson mGson;
    //<T>代表声明使用泛型
    //第二个 T 返回的类型是我们使用的类型
    //Class<T> 类型.class
    public static <T> T parseJson(String json, Class<T> tClass){
        if (mGson==null){
            mGson = new Gson();
        }
        if (TextUtils.isEmpty(json)){
            return null;
        }
       return mGson.fromJson(json,tClass);
    }
}

2.通过回调的方式

先实现3个类,HttpUtil和泛型类HttpRespon,HttpUtil,JsonUtil代码如下,通过调用HttpUtil的 getDate(String url, final HttpRespon respon)方法来获取数据

public class HttpUtil {
   static HttpUtil util;
   static OkHttpClient client;

   //这个构造方法永远只会被调用一次
   private HttpUtil(){
       //设置http的超时处理
       client = new OkHttpClient.Builder()
              .connectTimeout(10, TimeUnit.SECONDS)
               .writeTimeout(10, TimeUnit.SECONDS)
               .readTimeout(30, TimeUnit.SECONDS)
               .build();

   }


   //单例的方法
   public static  HttpUtil getInstance(){
        if (util==null){
            synchronized (HttpUtil.class){
                if (util==null){
                    util= new HttpUtil();
                }
            }
        }
        return util;
   }

//通过调用这个方法来获取数据传入url和respon 两个参数
   public void getDate(String url, final HttpRespon respon){
       Request request = new Request.Builder()
               .url(url)
               .build();

       //开启一个异步请求
       client.newCall(request).enqueue(new Callback() {
           //请求失败
           @Override
           public void onFailure(Call call, IOException e) {
               e.printStackTrace();
               respon.onError("连接服务器失败");
           }

           //有响应
           @Override
           public void onResponse(Call call, Response response) throws IOException {

               if (!response.isSuccessful()) {
                   //请求失败
               }
               //获取到接口的数据json格式
               String date = response.body().string();
               respon.prase(date);
           }
       });
   }
}

HttpRespon代码如下

/**
* 回应Http请求的类,回应请求的结果
* *HttpRespon<T>,T的类型要和HttpRespon(Class<T> t)   的类型,以及onSuccess(T t)的类型一致
*
* */

public abstract  class HttpRespon<T> {

   //http返回的类型的泛型
   Class<T> t;

    public HttpRespon(Class<T> t){
        this.t = t;
    }
   //请求失败,告诉调用者失败的原因
   public abstract void onError(String msg);
    //请求成功,http返回需要的类型,把类型传给onSuccess(T t),该方法对数据进行进一步处理
   public abstract void onSuccess(T t);

    public void prase(String json){
        if (TextUtils.isEmpty(json)){
            //请求失败
            onError("连接网络失败");
            return;
        }
        //如果只需要获取json对象,不用解析
        if (t==String.class){
            onSuccess((T) json);//json传回去
            return;
        }

        //尝试把json转化为我们需要的类型
        T result = JsonUtil.parseJson(json,t);

        //转化成功
        if (result!=null){
            //请求成功
            onSuccess(result);//在这里对数据返回的数据进行进一步处理
        }else{
            onError("json解析失败");
        }
    }
}

HttpRespon中prase(String json)方法所用到的JsonUtil类代码如下

public class JsonUtil {
  static Gson mGson;
   //<T>代表声明使用泛型
   //第二个 T 返回的类型是我们使用的类型
   //Class<T> 类型.class
   public static <T> T parseJson(String json, Class<T> tClass){
       if (mGson==null){
           mGson = new Gson();
       }
       if (TextUtils.isEmpty(json)){
           return null;
       }
      return mGson.fromJson(json,tClass);
   }
}

调用调用HttpUtil的 getDate(String url, final HttpRespon respon)方法,实现HttpRespon抽象类中的两个抽象方法即可获取到数据

HttpUtil util = HttpUtil.getInstance();
       //这里的url为我们所要请求的url接口
        String url = Constant.URL
        util.getDate(url, new HttpRespon<Hot>(Hot.class) {
            @Override
            public void onError(String msg) {
             
            }

            @Override
            public void onSuccess(Hot hot) {
             //这里的Hot类是根据json数据进行封装的,具体命名由自己来定
        });

这里的Hot类所要解析的javaBean类,即把json数据转换为Hot类对象,这里的Hot类由自己根据所请求的json数据进行封装,不一定命名为Hot,具体命名由自己来定。若不想解析,想要得要原始的Json数据,则把Hot改为String即

HttpUtil util = HttpUtil.getInstance();
       //这里的url为我们所要请求的url接口
        String url = Constant.URL
        util.getDate(url, new HttpRespon<String>(String.class) {
            @Override
            public void onError(String msg) {
             
            }

            @Override
            public void onSuccess(String json) {
             //这里的json就是原始的数据
        });