網(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)行展示