OKHttp与GSON获取JSON数据

        这段时间看blog,到处都是OKHttp,简直就是高效、简洁的HTTP编程的代名词,火过Volley,今天就来讲讲在项目使用中比较常见的获取JSON数据的实例。对JSON数据的处理,在以前的android中貌似有点小麻烦,需要用到java的反射机制,对于新手来说是比较麻烦的,好在现在有google的GSON和阿里的fastjson可以选择,本文实例选择GSON,进行处理。

        首先需要下载OKHTTP和GSON的jar包,OKHTTP还用到了okio,也需要下载相应的jar包,这些jar包网上搜寻一下有很多下载链接的,这里不再累述,不愿搜索的可以点击下列链接。

    OKHTTP:下载地址

    OKIO:下载地址

        有下列JSON数据

{"version":2,"data":[{"id":1,"remark":"1","appname":"UC浏览器","appcontent":"1","apppackagename":"com.UCMobile"}
,{"id":2,"remark":null,"appname":"支付宝","appcontent":null,"apppackagename":"com.alipay.android.app"}
,{"id":3,"remark":null,"appname":"WPS","appcontent":null,"apppackagename":"cn.wps.moffice_eng"}],"msg":"获取信息列表成功"}

        存放在本地服务中,url为http://192.168.10.133:8080/getAppInfor

        查看json数据,有下列关键词:version,data,msg。data中有id,remark,appname,appcontent,apppackagename

        新建两个数据类,分别对应相应的选项

public class ApkInfo {
	private String apppackagename;
	private Integer id;
    private String appname;
    private String appcontent;
    private String remark;
	public String getApppackagename() {
		return apppackagename;
	}

	public void setApppackagename(String apppackagename) {
		this.apppackagename = apppackagename;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getAppname() {
		return appname;
	}

	public void setAppname(String appname) {
		this.appname = appname;
	}

	public String getAppcontent() {
		return appcontent;
	}

	public void setAppcontent(String appcontent) {
		this.appcontent = appcontent;
	}

	public String getRemark() {
		return remark;
	}

	public void setRemark(String remark) {
		this.remark = remark;
	}

	@Override
	public String toString() {
		return "ApkInfo [id=" + id + ", remarm="
				+ remark + ", appname=" + appname + ", appcontent=" + appcontent
				+ ", apppackagename=" + apppackagename + "]";
	
	}
}

public class PackageListInfo {
	private String msg;
	private String version;
	private List<Object> data;

	public String getMsg() {
		return msg;
	}
	
	public void setMsg(String msg) {
		this.msg = msg;
	}
	
	public String getVersion() {
		return version;
	}
	
	public void setVersion(String version) {
		this.version = version;
	}
	
	public List<Object> getData() {
		return data;
	}

	public void setData(List<Object> data) {
		this.data = data;
	}
	
	@Override
	public String toString() {
		return "PackageListInfo [version=" + version + ", data=" + data + ", msg=" + msg
				+ "]";
	}

}

需要注意的是,类中的变量名必须与JSON数据中的关键词要一样。

新建一个OKHTTP的管理类get得到JSON数据,并进行处理。

import android.util.Log;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class GetApkPackage {

	public static String apkPackageUrl = http://192.168.10.133:8080/getAppInfor;
	
	public static GetApkPackage install = new GetApkPackage();
	
    public static ArrayList<String> appList=new ArrayList<String>();
    
	public void getPackage() {
		OkHttpClient mOkHttpClient = new OkHttpClient();
		final Request request = new Request.Builder().url(apkPackageUrl).build();
		mOkHttpClient.newCall(request).enqueue(new Callback() {

			@Override
			public void onFailure(Call call, IOException e) {
				System.out.println("获取apk列表失败");
				Log.d("GetApkPackage", e.getMessage());
				
			}
			@Override
			public void onResponse(Call call, Response response) throws IOException {
				String result = response.body().string();
				System.out.println(result);
			    //InputStream is = response.body().byteStream();
			    //byte[] bytes = response.body().bytes();
				Gson gson = new Gson();
				PackageListInfo packlist = gson.fromJson(result,PackageListInfo.class);
				
				System.out.println(packlist.getData().toString());
				List<ApkInfo> apkList = new ArrayList<ApkInfo>();
				Type type = new TypeToken<ArrayList<ApkInfo>>() {}.getType();
				apkList = gson.fromJson(packlist.getData().toString(), type);
				/*
				Map<String,ApkInfo> apkList = gson.fromJson(packlist.getData().toString(),  
		                new TypeToken<List<ApkInfo>>() {  
		                }.getType());
		        */
				if(apkList == null){
					System.out.println("apkpackage列表为空");
					return;
				}
				for(int i =0;i<apkList.size();i++){  
					  String apkName = apkList.get(i).getApppackagename();
	                  System.out.println(apkName); 
	                  appList.add(apkName);
	  
	          } 
			}
		});
	}
	
	public static GetApkPackage getInstall(){		
		return install;
	}

}

上述代码中,对JSON数据的处理看起来很简单,只要new一个GSON实例,然后通过gson.fromJson方法,就能够得到json数据

Gson gson = new Gson();
PackageListInfo packlist = gson.fromJson(result,PackageListInfo.class);

OKHTTP发送一个字符串给服务器的实例如下:

public final class PostString {
  public static final MediaType MEDIA_TYPE_MARKDOWN
      = MediaType.parse("text/x-markdown; charset=utf-8");

  private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    String postBody = ""
        + "Releases\n"
        + "--------\n"
        + "\n"
        + " * _1.0_ May 6, 2016\n"
        + " * _1.1_ June 15, 2016\n"
        + " * _1.2_ August 11, 2016\n";

    Request request = new Request.Builder()
        .url("https://192.168.10.133:8080/base")
        .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody))
        .build();

    Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

    System.out.println(response.body().string());
  }

  public static void main(String... args) throws Exception {
    new PostString().run();
  }
}



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值