Android萬能解析Json(一)

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)組成蓬痒,JsonObjectJsonArray

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)行下一步的工作

image

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ù)

JsonArrayJsonObject的方法基本一致洞渤,唯一不同的是插入hashmap中的key值的類型,JsonObjectString属瓣,JsonArrayint载迄,就像有的開門是用鑰匙,有的用指紋抡蛙。

但是在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中推溃。

image

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傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末届腐,一起剝皮案震驚了整個(gè)濱河市铁坎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌犁苏,老刑警劉巖硬萍,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異傀顾,居然都是意外死亡襟铭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門短曾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寒砖,“玉大人,你說我怎么就攤上這事嫉拐×ǘ迹” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵婉徘,是天一觀的道長漠嵌。 經(jīng)常有香客問我,道長盖呼,這世上最難降的妖魔是什么儒鹿? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮几晤,結(jié)果婚禮上约炎,老公的妹妹穿的比我還像新娘。我一直安慰自己蟹瘾,他們只是感情好圾浅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著憾朴,像睡著了一般狸捕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上众雷,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天灸拍,我揣著相機(jī)與錄音做祝,去河邊找鬼。 笑死株搔,一個(gè)胖子當(dāng)著我的面吹牛剖淀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纤房,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼纵隔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了炮姨?” 一聲冷哼從身側(cè)響起捌刮,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舒岸,沒想到半個(gè)月后绅作,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛾派,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年俄认,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洪乍。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡眯杏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壳澳,到底是詐尸還是另有隱情岂贩,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布巷波,位于F島的核電站萎津,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抹镊。R本人自食惡果不足惜锉屈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垮耳。 院中可真熱鬧颈渊,春花似錦、人聲如沸氨菇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽查蓉。三九已至,卻和暖如春榜贴,著一層夾襖步出監(jiān)牢的瞬間豌研,已是汗流浹背妹田。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹃共,地道東北人鬼佣。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像霜浴,于是被迫代替她去往敵國和親晶衷。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • JSON的特點(diǎn): 1阴孟、JSON比XML的數(shù)據(jù)傳遞的有效性高晌纫;2、JSON完全獨(dú)立于編程語言永丝;3锹漱、JSON的本質(zhì)是具...
    程序員之路閱讀 3,491評論 0 3
  • 前端調(diào)用API的時(shí)候大多數(shù)都是使用json作為數(shù)據(jù)的返回格式,json也可以作為一種格式來進(jìn)行數(shù)據(jù)存儲(chǔ)慕嚷,也給我們提...
    不知名的蛋撻閱讀 5,856評論 0 1
  • 在一個(gè)方法內(nèi)部定義的變量都存儲(chǔ)在棧中哥牍,當(dāng)這個(gè)函數(shù)運(yùn)行結(jié)束后,其對應(yīng)的棧就會(huì)被回收喝检,此時(shí)嗅辣,在其方法體中定義的變量將不...
    Y了個(gè)J閱讀 4,414評論 1 14
  • 室友說,要不要跟她回赤壁偷耳機(jī)蛇耀,我想辩诞,還是算了吧,要是被抓住了怎么辦纺涤,應(yīng)該會(huì)被判刑吧译暂。我好不容易走到今天,我不可以...
  • 又是一篇文言文撩炊,感覺已經(jīng)比第一次畫的時(shí)候順手一些了外永,慢慢的肯定會(huì)越來越好的!加油拧咳!
    全腦教育素素老師閱讀 189評論 0 0