了解Android的人都知道JSON,JSON是当前最最为通用的两种数据格式之一,对Android有一定了解的人都知道JSON,都知道如何解析JSON无非就是JSONObject和JSONArray两个类的API的使用,但是这样的话在解析较为复杂的JSON字符串的时候会耗费较多的时间,本文就是来讲解如何快速的去解析JSON字符串
接下来会向大家介绍两个东西:
gson框架和插件GsonFormat
gson架包下载地址:
http://download.csdn.net/detail/w18756901575/9521813
注:对NoHttp不了解的可以参考我的另一篇博客:
http://blog.csdn.net/w18756901575/article/details/51303356
当然也可以使用你自己习惯的网络请求方式
上代码:
package wkk.demo5;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.yolanda.nohttp.NoHttp;
import com.yolanda.nohttp.OnResponseListener;
import com.yolanda.nohttp.Request;
import com.yolanda.nohttp.RequestMethod;
import com.yolanda.nohttp.RequestQueue;
import com.yolanda.nohttp.Response;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
private String appkey = "006eb154538b436f875b462503de9d12";
private String url = "http://api.avatardata.cn/Joke/QueryJokeByTime";
public RequestQueue requestQueue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NoHttp.init(getApplication());
requestQueue = NoHttp.newRequestQueue();
Request<JSONObject> request = NoHttp.createJsonObjectRequest(url, RequestMethod.POST);
request.add("key", appkey);
request.add("time", "1418816972");
request.add("sort", "asc");
requestQueue.add(1, request, new OnResponseListener<JSONObject>() {
@Override
public void onStart(int what) {
}
@Override
public void onSucceed(int what, Response<JSONObject> response) {
JSONObject jsonObject = response.get();
Log.d("测试", jsonObject.toString());
}
@Override
public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) {
Log.d("测试", exception.toString());
}
@Override
public void onFinish(int what) {
}
});
}
}
好,得到数据之后对数据进行解析:
@Override
public void onSucceed(int what, Response<JSONObject> response) {
JSONObject jsonObject = response.get();
Log.d("测试", jsonObject.toString());
//首先创建一个Gson对象
Gson gson = new Gson();
//Gson类中有一个方法 fromJSon 参数分别为Json类型的字符串 还有T类型的.class
//T是泛型 不明白的可以去百度一下
//此方法会返回一个T类型的值
T t = gson.fromJson(jsonObject.toString(), T.class);
}
但是这个T类应该如何编写呢?
比较笨的写法Object对应类,Array对性集合,然后相同的变量名等等,比较麻烦,我们这里来使用GsonFormat这个插件来快速的编写Gson所需要的实体类
下载安装插件:
Android studio File→Settings..→Plugins→Browse repositores..搜索GsonFormat
然后下载安装,完成之后重启Android studio,我的是安装好的所以右侧界面会有所不同,
然后新建一个类,快捷键Alt+Insert
选择GsonFormat并将Json字符串粘贴进去
点击OK
这样就完成了实体类的编写了
然后解析:
@Override
public void onSucceed(int what, Response<JSONObject> response) {
JSONObject jsonObject = response.get();
Log.d("测试", jsonObject.toString());
//首先创建一个Gson对象
Gson gson = new Gson();
//Gson类中有一个方法 fromJSon 参数分别为Json类型的字符串 还有T类型的实体类.class
//T是泛型 不明白的可以去百度一下
//此方法会返回一个T类型的值
JsonBean jsonBean = gson.fromJson(jsonObject.toString(), JsonBean.class);
//这个jsonBean就是我们所需要的数据,里面的各个属性就对应Json字符串里面的各个字段
Log.d("测试", String.valueOf(jsonBean.getError_code()));
Log.d("测试", jsonBean.getReason());
List<JsonBean.ResultBean> list= jsonBean.getResult();
for(JsonBean.ResultBean resultBean:list){
Log.d("测试",resultBean.getContent());
}
}
Log如下:
怎么样,是不是很方便呢?
再多讲两句,有时候我们想要利用Gson来解析JSONArray,但是Gson只有解析JSONObject的方法,那怎么办呢?也不难,可以利用GsonFormat来将Array中的一个对象封装成一个实体类,然后for循环遍历JSONArray,将其中的每一个对象当做一个JSONObject来进行解析就行了
例如:
List<T> list1=new ArrayList<T>();
JSONArray jsonArray=new JSONArray();
for (int i=0;i<jsonArray.length();i++){
Gson gson1 = new Gson();
T t= gson1.fromJson(jsonArray.getString(i),T.class);
list1.add(t);
}