Android萬能解析并獲取Json數(shù)據(jù)袜硫,所有Json結(jié)構(gòu)一個(gè)解決
具體使用方法
想要解析Json數(shù)據(jù),首先要了解Json數(shù)據(jù)的組成
Json的組成
我自己學(xué)的時(shí)候查了很多關(guān)于json數(shù)據(jù)的結(jié)構(gòu)晌端,得到的答案都不是自己想要的捅暴,以下是本人對Json數(shù)據(jù)初略的理解。
很簡單咧纠,Json數(shù)據(jù)中由兩種結(jié)構(gòu)組成蓬痒,JsonObject和JsonArray。
JsonObject:就是用 { } 括起一個(gè)對象Object的數(shù)據(jù)組漆羔,是由一個(gè)或多個(gè)** {key梧奢,value} **這種數(shù)據(jù)組成。
JsonArray:就是用 [ ] 括起一個(gè)數(shù)組Array的數(shù)據(jù)組演痒,是由一個(gè)或多個(gè) [ ] 數(shù)組數(shù)據(jù)組成亲轨。
無論多復(fù)雜的Json數(shù)據(jù)都是有這兩種數(shù)據(jù)組成,就像俄羅斯套娃一樣鸟顺,一個(gè)套一個(gè)形成復(fù)雜的數(shù)據(jù)結(jié)構(gòu)惦蚊。
知道組成之后我們就可以進(jìn)行對數(shù)據(jù)的解析
解析Json數(shù)據(jù)就像是小偷去別人家里偷東西一樣。
廢話不多說讯嫂,解析走起
從網(wǎng)站中獲取Json數(shù)據(jù)蹦锋,轉(zhuǎn)化成String
private void sendRequsetWithOKHttp() {
new Thread(new Runnable() {
@Override
public void run() {
try{
//耗時(shí)操作放在新線程
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("這里放網(wǎng)址").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
LinkedHashMap<String,Object> hashMaps=stringToJsonObject(responseData);
//把數(shù)據(jù)傳出線程
Message message=new Message();
message.obj=hashMaps;
handler.sendMessage(message);
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
不懂得小伙伴自行百度OKhttp
判斷Json數(shù)據(jù)結(jié)構(gòu)并分別解析
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;
}
}
先把從網(wǎng)站中獲取的Json數(shù)據(jù)的String放進(jìn)一個(gè)對象Object中,進(jìn)行判斷第一層是JsonArray還是JsonObject欧芽,繼續(xù)進(jìn)行下一步的工作
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結(jié)構(gòu)為 {Key,value} ,所以我用迭代器把JsonObject中的key提取出來莉掂。
然后利用提取的key取出jso.get(key1)
判斷value值是否還是JsonObject?
就像小偷去翹門千扔,復(fù)制了門的鑰匙憎妙,用鑰匙打開門,看看里面是房間還是另一扇門昏鹃。如果是房間(純粹的jsonObject數(shù)據(jù))的話就把房間里的東西全部轉(zhuǎn)到袋子(Hashmap)里,如果是門(JsonObject中套JsonObject)就接著翹诀诊。
JsonArray解析方法
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;
}
獲取Json數(shù)據(jù)
JsonArray和JsonObject的方法基本一致洞渤,唯一不同的是插入hashmap中的key值的類型,JsonObject是String属瓣,JsonArray是int载迄,就像有的開門是用鑰匙,有的用指紋抡蛙。
但是在json數(shù)據(jù)中JsonObject是和hashmap一樣的 {key护昧,value} 結(jié)構(gòu)。但是JsonArray結(jié)構(gòu)是數(shù)組結(jié)構(gòu)粗截,沒有key值惋耙。然后hashmap的插入是無序的,插入的時(shí)候沒有事,轉(zhuǎn)一轉(zhuǎn)格式就進(jìn)去了绽榛。但是取出的時(shí)候Object可以取出你想要的值湿酸,Array這個(gè)殺千刀的卻不行。
解決的方法也很簡單灭美,用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數(shù)據(jù)的方法,不足之處希望大家請教
完整的代碼:GitHub傳送門