json字符串的生成與解

網(wǎng)絡(luò)通信中很多情況下都是以json字符串的形式來傳遞數(shù)據(jù)的风喇,所以在客戶端向服務(wù)器發(fā)送數(shù)據(jù)時(shí)需要生成json字符串,在客戶端收到服務(wù)器的數(shù)據(jù)時(shí)需要解析json字符串樊破,這里說明用java原生的方法如何解決

json字符串的生成

1 利用JSONObject與JSONArray
利用JSONObject可以生成jsonObject格式的json字符串
利用JSONArray可以生成jsonArray格式的json字符串
兩者結(jié)合使用就可以生成很復(fù)雜的json字符串
下面直接說明兩者結(jié)合創(chuàng)建復(fù)雜字符串的過程
外層是jsonObject格式類型的

//最外層的json
        JSONObject obj=new JSONObject();
        obj.put("status","ok");
        obj.put("verson",1.0);
        //內(nèi)部嵌套的jsonObject格式的字符串
        JSONObject object=new JSONObject();
        object.put("name","aaa");
        object.put("age",22);
        obj.put("person",object);
        //內(nèi)部嵌套jsonArray格式的json字符串
        JSONArray array=new JSONArray();
        for(int i=0;i<3;i++)
        {
            JSONObject jsonObject=new JSONObject();
            jsonObject.put("bookname","name"+i);
            jsonObject.put("price",i);
            array.add(jsonObject);
        }
        obj.put("book",array);
        //講JSONObect對(duì)象轉(zhuǎn)換成json字符串
        String jsonString=obj.toString();

生成的json字符串的格式如下

{
    "verson": 1,
    "person": {
        "age": 22,
        "name": "aaa"
    },
    "status": "ok",
    "book": [
        {
            "price": 0,
            "bookname": "name0"
        },
        {
            "price": 1,
            "bookname": "name1"
        },
        {
            "price": 2,
            "bookname": "name2"
        }
    ]
}

生成外層是jsonArray格式的json字符串

 JSONArray array=new JSONArray();
        for(int i=0;i<3;i++)
        {
            JSONObject jsonObject=new JSONObject();
            jsonObject.put("bookname","name"+i);
            jsonObject.put("price",i);
            array.add(jsonObject);
        }
        String jsonString=array.toString();

格式如下

[
    {
        "price": 0,
        "bookname": "name0"
    },
    {
        "price": 1,
        "bookname": "name1"
    },
    {
        "price": 2,
        "bookname": "name2"
    }
]

2 利用JSONStringer生成json字符串
JSONStringer采用鏈?zhǔn)浇Y(jié)構(gòu)
object()和endObject()之間的對(duì)應(yīng)上面的JSONObject對(duì)象
array()和endArray()之間的內(nèi)容對(duì)應(yīng)上面的JSONArray對(duì)象
key()里面?zhèn)魅腈I值愉棱,value()里面?zhèn)魅胫?br> 最后toString()轉(zhuǎn)成json字符串

JSONStringer jsonStringer=new JSONStringer();
        String string= null;
        try {
            string = jsonStringer.object()
                    .key("name")
                    .value("aaa")
                    .key("status")
                    .value(1)
                    .key("book")
                    .array()
                    .object()
                    .key("bookname")
                    .value("aaa")
                    .key("price")
                    .value(1)
                    .endObject()
                    .endArray()
                    .endObject()
                    .toString();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        Log.i("test",string);

得到的json字符串如下

{
    "name": "aaa",
    "status": 1,
    "book": [
        {
            "bookname": "aaa",
            "price": 1
        }
    ]
}

比較
前者比較復(fù)雜,但是不容易出錯(cuò)
后者比較簡單哲戚,但是容易拼接錯(cuò)誤

JSON的解析

這個(gè)過程就是把從服務(wù)端獲取到的json字符串的內(nèi)容取出來奔滑,或者轉(zhuǎn)化為相應(yīng)的實(shí)體類的過程
這個(gè)過程就是把相應(yīng)的json字符串轉(zhuǎn)化成JSONObject對(duì)象或者JSONArray對(duì)象,然后在獲取具體的值的過程
1 如果是一個(gè)jsonObject類型的字符串

{
"name": "aaa",
"status": 1
}

try {
//首先創(chuàng)建一個(gè)JSONObject對(duì)象顺少,并將相應(yīng)的字符串傳入
//這樣json字符串就轉(zhuǎn)換成了JSONObject對(duì)象
JSONObject object=new JSONObject(json);
//然后再通過key值取到相應(yīng)的數(shù)據(jù)
String name=object.getString("name");
int status=object.getInt("status");
Log.i("test",name+status);
} catch (JSONException e) {
e.printStackTrace();
}

2 如果是一個(gè)jsonArray類型的json字符串

[
{
"name": "aaa",
"status": 1
},
{
"name": "bbb",
"status": 2
}

]

try {
//首先創(chuàng)建一個(gè)JSONArray對(duì)象朋其,并將相應(yīng)的字符串傳入
//這樣json字符串就轉(zhuǎn)換成了JSONObject對(duì)象
JSONArray array=new JSONArray(json);
//array其實(shí)就是一個(gè)數(shù)組王浴,遍歷它獲取每一項(xiàng)的內(nèi)容
for(int i=0;i<array.length();i++)
{
//通過getJSONObject獲取到內(nèi)部的JSONObject對(duì)象
JSONObject object=array.getJSONObject(i);
String name=object.getString("name");
int status=object.getInt("status");
Log.i("test",name+status);
}
} catch (JSONException e) {
e.printStackTrace();
}

3 復(fù)雜的json
其實(shí)復(fù)雜的json解析起來就是循環(huán)上面兩個(gè)步驟
首先判讀最外層是{}還是[]決定最開始轉(zhuǎn)換的方式
然后取里面的內(nèi)容
如果取到的是JSONObject對(duì)象,就用1方法獲取到里面的值
如果取到的時(shí)JSONArray對(duì)象令宿,就用2 方法取值
例如

{
"name": "aaa",
"status": 1,
"parent":{
"father":"father",
"mother":"mother"
},
"student":[
{
"school":"a",
"grade":1
},
{
"school":"b",
"grade":2
}
]
}

try {
//獲取整體的對(duì)象
JSONObject object=new JSONObject(json);
String name=object.getString("name");
int status=object.getInt("status");
//獲取內(nèi)部的JSONObject對(duì)象
JSONObject obj=object.getJSONObject("parent");
String mother=obj.getString("mother");
String father=obj.getString("father");
//獲取內(nèi)部的JOSNArray對(duì)象
JSONArray array=object.getJSONArray("student");
for(int i=0;i<array.length();i++)
{
JSONObject obj1=array.getJSONObject(i);
String school=obj1.getString("school");
int grade=obj1.getInt("grade");
Log.i("test", name+status+mother+father+school+grade);
}

    } catch (JSONException e) {
        e.printStackTrace();
    }
解析完的數(shù)據(jù)可以存儲(chǔ)到實(shí)體類或者實(shí)體類list中叼耙,然后傳遞到需要的地方進(jìn)行展示
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市粒没,隨后出現(xiàn)的幾起案子筛婉,更是在濱河造成了極大的恐慌,老刑警劉巖癞松,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爽撒,死亡現(xiàn)場離奇詭異,居然都是意外死亡响蓉,警方通過查閱死者的電腦和手機(jī)硕勿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枫甲,“玉大人源武,你說我怎么就攤上這事∠牖茫” “怎么了粱栖?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脏毯。 經(jīng)常有香客問我闹究,道長,這世上最難降的妖魔是什么食店? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任渣淤,我火速辦了婚禮,結(jié)果婚禮上吉嫩,老公的妹妹穿的比我還像新娘价认。我一直安慰自己,他們只是感情好自娩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布刻伊。 她就那樣靜靜地躺著,像睡著了一般椒功。 火紅的嫁衣襯著肌膚如雪捶箱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天动漾,我揣著相機(jī)與錄音丁屎,去河邊找鬼。 笑死旱眯,一個(gè)胖子當(dāng)著我的面吹牛晨川,可吹牛的內(nèi)容都是我干的证九。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼共虑,長吁一口氣:“原來是場噩夢啊……” “哼愧怜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妈拌,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤拥坛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尘分,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猜惋,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年培愁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了著摔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡定续,死狀恐怖谍咆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情私股,我是刑警寧澤摹察,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站庇茫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏螃成。R本人自食惡果不足惜旦签,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寸宏。 院中可真熱鬧宁炫,春花似錦、人聲如沸氮凝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罩阵。三九已至竿秆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稿壁,已是汗流浹背幽钢。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留傅是,地道東北人匪燕。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓蕾羊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帽驯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子龟再,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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