最近很多朋友问到我解析Json的问题,很多都是太复杂,解析起来很麻烦,但大部分都是使用工具进行解析,比如Gson之类的,但是这些有个问题就是要创建一个实体类bean,但是往往在很多开发过程中,后台返回数据是会随着迭代而改变的,这样创建的实体类bean可能也要改变,这里我就说说自己解析的一些心得。
首先我并没有用到第三方的解析工具,而是单纯的使用系统提供的JsonObject和JsonArray。然后获取到的数据字段存储我是用到的HashMap<String,Object>,这样就对于实体类很吻合了,key对应的实体类里面变量名字,value对应实体类里的变量值。如果有集合就可以在HashMap外面套上Arraylist之类的。
下面就开始提供代码块:
private HashMap<String, Object> stringToJsonObject(String response) {
try {
JSONObject jsa = new JSONObject(response);
return JsonToHashMap(jsa);
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
private HashMap<String, Object> JsonToHashMap(JSONObject jsa) {
HashMap<String, Object> hashmap = new HashMap<>();
try {
for (Iterator<String> keyStr = jsa.keys(); keyStr.hasNext(); ) {
String key1 = keyStr.next().trim();
if (jsa.get(key1) instanceof JSONObject) {
hashmap.put(key1, jsa.get(key1));
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return hashmap;
}
这样就可以将一个jsonObject转换成HashMap了,但是HashMap里面还是含有类似Json的,那就再重复上面操作就行了。
下面再来解析JsonObject
public ArrayList<HashMap<String, Object>> dataListTmp = new ArrayList<HashMap<String, Object>>();
try {
JSONObject jsonObject = new JSONObject(respanse);
JSONArray jsonArray = new JSONArray(jsonObject.getString("result"));
JSONObject jsonObject1 = new JSONObject(jsonArray.get(0).toString());
JSONArray jsonArray1 = new JSONArray(jsonObject1.getString("Items"));
for (int i = 0; i < jsonArray1.length(); i++) {
JSONObject jsoo = jsonArray1.getJSONObject(i);
HashMap<String, Object> map1 = new HashMap<String, Object>();
Iterator it = jsoo.keys();
while (it.hasNext()) {
String key = (String) it.next();
String value = jsoo.getString(key);
map1.put(key, value);
}
dataListTmp.add(map1);
}
} catch (JSONException e) {
e.printStackTrace();
}
通过一个Iterator迭代一下就可以获取到key和value,具体还是需要看看具体需求,随机应变。先将json分析一下,一般公司后台提供json都有一定规律的,因此一些解析方式可以在项目中提取出来,完全可以复用,再也不用去新建bean实体类了,也抛开了第三方工具的使用。