想要解析Json数据,首先要了解Json数据的组成
我自己学的时候查了很多关于json数据的结构,得到的答案都不是自己想要的,以下是本人对Json数据初略的理解。
很简单,Json数据中由两种结构组成,JsonObject和JsonArray。
JsonObject:就是用 { } 括起一个对象Object的数据组,是由一个或多个 {key,value} 这种数据组成。
JsonArray:就是用 [ ] 括起一个数组Array的数据组,是由一个或多个 [ ] 数组数据组成。
无论多复杂的Json数据都是有这两种数据组成,就像俄罗斯套娃一样,一个套一个形成复杂的数据结构。
知道组成之后我们就可以进行对数据的解析
废话不多说,解析走起
private void sendRequsetWithOKHttp() {
new Thread(new Runnable() {
@Override
public void run() {
try{
//耗时操作放在新线程
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("这里放网址").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
LinkedHashMap<String,Object> hashMaps=stringToJsonObject(responseData);
//把数据传出线程
Message message=new Message();
message.obj=hashMaps;
handler.sendMessage(message);
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
不懂得小伙伴自行百度OKhttp
private LinkedHashMap<String, Object> stringToJsonObject(String response) {
try {
Object json=new JSONTokener(response).nextValue();
if(json instanceof JSONObject){
JSONObject jso = new JSONObject(response);
return JsonObjectToHashMap(jso);
}else{
JSONArray jsa=new JSONArray(response);
return JsonArrayToHashMap(jsa);
}
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
先把从网站中获取的Json数据的String放进一个对象Object中,进行判断第一层是JsonArray还是JsonObject,继续进行下一步的工作
private LinkedHashMap<String, Object> JsonObjectToHashMap(JSONObject jso) {
LinkedHashMap<String, Object> hashmap = new LinkedHashMap<>();
try {
for (Iterator<String> keyStr = jso.keys(); keyStr.hasNext(); ) {
String key1 = keyStr.next().trim();
if (jso.get(key1) instanceof JSONObject) {
JSONObject NextJSONObject=new JSONObject(jso.get(key1).toString());
hashmap.put(key1, JsonObjectToHashMap(NextJSONObject));
}else if(jso.get(key1) instanceof JSONArray) {
JSONArray NextJSONArray =new JSONArray(jso.get(key1).toString());
hashmap.put(key1, JsonArrayToHashMap(NextJSONArray));
}else {
hashmap.put(key1, jso.get(key1));
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return hashmap;
}
上面提到JsonObject结构为 {Key,value} ,所以我用迭代器把JsonObject中的key提取出来。
然后利用提取的key取出jso.get(key1)
判断value值是否还是JsonObject?
就像小偷去翘门,复制了门的钥匙,用钥匙打开门,看看里面是房间还是另一扇门。如果是房间(纯粹的jsonObject数据)的话就把房间里的东西全部转到袋子(Hashmap)里,如果是门(JsonObject中套JsonObject)就接着翘。
private LinkedHashMap<String, Object> JsonArrayToHashMap(JSONArray jsa){
LinkedHashMap<String, Object> hashMap = new LinkedHashMap<>();
try {
for (int i = 0; i < jsa.length(); i++) {
if(jsa.get(i) instanceof JSONArray) {
JSONArray NextJSONArray=new JSONArray(jsa.get(i).toString());
hashMap.put(String.valueOf(i), JsonArrayToHashMap(NextJSONArray));
}else if(jsa.get(i) instanceof JSONObject){
JSONObject NextJSONObject=new JSONObject(jsa.get(i).toString());
hashMap.put(String.valueOf(i),JsonObjectToHashMap(NextJSONObject));
}
}
}catch (JSONException e){
e.getStackTrace();
}
return hashMap;
}
JsonArray和JsonObject的方法基本一致,唯一不同的是插入hashmap中的key值的类型,JsonObject是String,JsonArray是int,就像有的开门是用钥匙,有的用指纹。
但是在json数据中JsonObject是和hashmap一样的 {key,value} 结构。但是JsonArray结构是数组结构,没有key值。然后hashmap的插入是无序的,插入的时候没有事,转一转格式就进去了。但是取出的时候Object可以取出你想要的值,Array这个杀千刀的却不行。
解决的方法也很简单,用LinkedHashmap<>,这东西就是有序插入到Hashmap中。
private String getpoint(LinkedHashMap<String ,Object> LinkedHashMap, String[] s){
String get=null;
String[] index=s;
LinkedHashMap<String ,Object> linked=LinkedHashMap;
for(int i = 0;i<sr.length;i++){
songs=linked.get(sr[i]);
if(songs instanceof LinkedHashMap){
linked=(LinkedHashMap<String ,Object>)songs;
continue;
}else {
get=songs.toString();
}
}
return get;
}
以上就是万能解析并获取Json数据的方法,不足之处希望大家请教
完整的代码:GitHub传送门