现在的网络请求数据传输应该基本上都是以JSON形式为主了,XML占少数,所以今天回顾并记录一下常用的几中JSON数据解析法:1,google原生json解析;2,同样也是google出品,只不过是半封装好的,应用了java反射原理的gson解析;3,第三个就是大名鼎鼎的阿里巴巴出品的工具类fastjson解析。
一、首先讲一下最原生、最底层的json解析。
如果JSON对象是一个Map(即Map<K,V>),则从接收String对象中获取JSON对象后,再根据所对应的key,取得每一个JSONObject对象所对应的map对象,最后再从map对象中按k获取相应的值v,如下例:
public Map<String, Object> jsonToMap(String key, String jsonString) {
Map<String, Object> map = new HashMap<String, Object>();
try {
JSONObject object = new JSONObject(jsonString);
JSONObject obj = object.getJSONObject(key);
Iterator iterator = obj.keys();
while (iterator.hasNext()) {
String k = (String) iterator.next();
Object v = obj.get(k);if (v == null)
v = "";
map.put(k, v);
}
} catch (JSONException e) {
e.printStackTrace();
}
return map;
}
如果JSON对象是一组Map(即List<Map<K,V>>),则从接收String对象中获取JSON对象后,再根据所对应的key,获取JSONArray数组,然后循环遍历该数组取得每一个JSONObject对象所对应的map对象,再从map对象中按k获取相应的值v,最后往list对象中添加每一个map对象,返回list。如下例:
public List<Map<String, Object>> getListMap(String key, String jsonString) {
List<Map<String, Object>> list = new ArrayList<>();
try {
JSONObject object = new JSONObject(jsonString);
JSONArray jsonArray = object.getJSONArray(key);//获取JSONArray数组
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject obj = jsonArray.getJSONObject(i);
Map<String, Object> map = new HashMap<>();
Iterator iterator = obj.keys();
while (iterator.hasNext()) {
String K = (String) iterator.next();
Object V = obj.get(K);
if (V == null)
V = "";
map.put(K, V);
}
list.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
return list;
}
如果JSON对象是一组自定义数据类型(即<T> List<T>),则从接收String对象中获取JSON对象后,再根据所对应的key,获取JSONArray数组,然后循环遍历该数组取得每一个json对象,并新建一个自定义数据类型对象t,然后根据键值关系从json对象中获取相应的值赋给t对象中相应的项,初始化完t对象后,往列表list中添加t,最后返回list。如下例:(注意例中的T
t=new T()只是泛指某个数据类型)
public <T> List<T> getListT(String key, String jsonString) {
List<T> list = new ArrayList<>();
try {
JSONObject object = new JSONObject(jsonString);
JSONArray jsonArray = object.getJSONArray(key);
for (int i = 0; i < jsonArray.length(); i++) {
T t=new T();//自定义数据类型对象初始化
JSONObject obj = jsonArray.getJSONObject(i);
t.setXx(obj.get("xx"));//将每一个json对象根据键值对关系取出相应的值赋给自定义数据类型对象相应的项
list.add(t);//列表添加第一个被赋值好的自定义数据类型对象
}
} catch (JSONException e) {
e.printStackTrace();
}
return list;//返回列表
}
最后还有一种最简单的即返回一组String,这里就不举例了,非常简单地先获取JSONArray再遍历取出每一项添加到List<String>对象中去,实际开发中不会有这么简单的数据,这里略为带过。
二、然后讲一下google封装好的工具,gson解析。
首先要添加项目所依赖的jar包,只需添加 一句compile 'com.google.code.gson:gson:2.7'即可,当然可能还有更新的版本,自己查找一下即可。
JSON数据解析成自定义数据类型对象,如下例:
public <T> T getData(String jsonString, Class<T> cs){
T t=new Gson().fromJson(jsonString,cs);
return t;
}
是不是非常简单,几乎一两行代码就搞定了,直接反射到自定义数据类型并返回初始化了的对象,省去了一大堆的赋值项烦琐的工作,这就是应用了反射的原理!再看JSON数据解析成一个MAP也是非常简单
public Map<String, Object> getMap(StringjsonString) {
Map<String, Object> map = new HashMap<>();
map = new Gson().fromJson(jsonString, new TypeToken<Map<String, Object>>() {
}.getType());
return map;
}
同样简单地将JSON数据解析成List<Map<K,V>>集合
public List<Map<String, Object>> getListMap(String jsonString) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
list = new Gson().fromJson(jsonString, new TypeToken<List<Map<String, Object>>>() {
}.getType());
return list;
}
在实际的项目开发中,最常见的是将JSON数据解析成各种自定义数据类型的集合
public <T> List<T> getListData(String jsonString) {
List<T> list = new ArrayList<T>();
list = new Gson().fromJson(jsonString, new TypeToken<List<T>>() {
}.getType());
return list;
}
So easy吧!就是这么一行的代码即全部反射生成一个集合list
二、最后讲一下阿里巴巴出品的工具类fastjson解析。
首先同样是要添加项目所依赖的jar包,只需添加 一句compile 'com.alibaba:fastjson:1.2.34'即可,当然可能还有更新的版本,自己查找一下即可。
我就不啰嗦了,直接将几种常见的情况以工具类的形式一一列举出来即可,首先是将JSON数据解析成自定义数据类型对象
public <T> T getData(String jsonString, Class<T> cs) {
T t = JSON.parseObject(jsonString, cs);
return t;
}
然后是将JSON数据解析成自定义数据类型的集合
public <T> List<T> getListData(String jsonString, Class<T> cs) {
List<T> list = new ArrayList<T>();
list = JSON.parseArray(jsonString, cs);
return list;
}
以上两种解析是在实际项目开发中最常见的,以下顺便提一下不常见的几种解析,有兴趣参考即可
JSON数据解析成一个MAP
public Map<String, Object> getMap(String jsonString) {
Map<String, Object> map = new HashMap<String, Object>();
map = JSON.parseObject(jsonString, new TypeReference<Map<String, Object>>() {
});
return map;
}
JSON数据解析成List<Map<K,V>>集合
public List<Map<String, Object>> getListMap(String jsonString) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
list = JSON.parseObject(jsonString, new TypeReference<List<Map<String, Object>>>() {
});
return list;
}
N好了,打完收工!最后说一下三种解析法的特点吧,第一种是最原生的底层解析,如果是自定义数据类型会比较麻烦,要你自己一项项地取值赋值,在实地开发中基本无人使用;第二种是google发布的封装好的利用反射原理进行数据解析的工具类,在实际开发中进行各种自定义数据类型解析应用比较方便;第三种是阿里巴巴发布的同样也是利用反射原理进行解析的工具类,只不过进行了优化和再次封装,所说算法效率是最优的,这个没有实际测过,不太好说,反正后面两个是应用得最多的,具体选择哪一个,看自己的使用习惯和爱好吧!
共进共勉!