前言:在Android開發(fā)中我們避免不了從服務(wù)端獲取數(shù)據(jù),而服務(wù)端返回的數(shù)據(jù)基本上都是Json格式的,今天乘著公司不忙,特地總結(jié)一下Json的幾種解析方式。
一、Json是什么?
JSON是一種取代XML的數(shù)據(jù)結(jié)構(gòu),和xml相比,它更小巧但是性能仍然很好,由于它的小巧所以網(wǎng)絡(luò)傳輸數(shù)據(jù)使用的流量更少,傳輸?shù)乃俣雀?。JSON就是一串字符串 只不過元素會(huì)使用特定的符號(hào)標(biāo)注。
Json語法:
- {} 雙括號(hào)表示對象
- [] 中括號(hào)表示數(shù)組
- "" 雙引號(hào)內(nèi)是屬性或值
- : 冒號(hào)表示后者是前者的值(這個(gè)值可以是字符串、數(shù)字、也可以是另一個(gè)數(shù)組或?qū)ο?
所以 {"name": "張三"} 可以理解為是一個(gè)包含name為張三的對象
而[{"name": "張三"},{"name": "李四"}]就表示包含兩個(gè)對象的數(shù)組
當(dāng)然了,你也可以使用{"name":["Michael","Jerry"]}來簡化上面的步驟,這是一個(gè)擁有一個(gè)name數(shù)組的對象
二、Json怎么用?
生成json數(shù)據(jù)(這里只是簡單生成了一個(gè)Json對象,這里我們重點(diǎn)放在Json解析上)
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "張三");
jsonObject.put("age",18);
三、Json解析
這里三種方式難度依次遞進(jìn),掌握了前兩種幾乎就掌握了第三種,練習(xí)好了第三種以后碰到即使很復(fù)雜的數(shù)據(jù)也是這種套路,親測沒毛病!
①Json對象解析
/* {
"name":"大白",
"age":2
}*/
String str1 = "{\n" +
" \"name\":\"大白\",\n" +
" \"age\":2\n" +
" }";
JSONObject jsonObject = new JSONObject(str1.toString());
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
Str1 str1 = new Str1();
str1.setName(name);
str1.setAge(age);
②json數(shù)組解析
/*
[
{"name":"張三","age":18},
{"name":"李四","age":19},
{"name":"王五","age":20}
]
*/
String str2 = " [\n" +
" {\"name\":\"張三\",\"age\":18}, \n" +
" {\"name\":\"李四\",\"age\":19}, \n" +
" {\"name\":\"王五\",\"age\":20} \n" +
" ] ";
JSONArray jsonArray = new JSONArray(str2.toString());
ArrayList<Str2> list2 = new ArrayList<>();
JSONObject jsonObject = null;
Str2 str2 = null;
for (int i=0;i<jsonArray.length();i++) {
jsonObject = jsonArray.getJSONObject(i);
str2 = new Str2();
str2.setName(jsonObject.getString("name"));
str2.setAge(jsonObject.getInt("age"));
list2.add(str2);
str2 = null;
}
③json對象和數(shù)組解析
/*
{
"banji": "初中一班",
"message": "1",
"student": [{
"name": "張三",
"age": 18
}, {
"name": "李四",
"age": 19
}, {
"name": "王五",
"age": 20
}]
}
*/
String str3 = "{\n" +
"\t\"banji\": \"初中一班\",\n" +
"\t\"message\": \"1\",\n" +
"\t\"student\": [{\n" +
"\t\t\"name\": \"張三\",\n" +
"\t\t\"age\": 18\n" +
"\t}, {\n" +
"\t\t\"name\": \"李四\",\n" +
"\t\t\"age\": 19\n" +
"\t}, {\n" +
"\t\t\"name\": \"王五\",\n" +
"\t\t\"age\": 20\n" +
"\t}]\n" +
"}";
JSONObject jsonObject = new JSONObject(str3.toString());
ArrayList<Str3.Student> list3 = new ArrayList<>();
Str3 str3 = new Str3();
String banji = jsonObject.getString("banji");
String message = jsonObject.getString("message");
//對student集合進(jìn)行解析
JSONArray students = jsonObject.getJSONArray("student");
for (int i=0;i<students.length();i++) {
JSONObject jsonObject1 = students.getJSONObject(i);
String name = (String) jsonObject1.get("name");
int age = (int) jsonObject1.get("age");
Str3.Student student = new Str3.Student();
student.setName(name);
student.setAge(age);
list3.add(student);
student = null;
}
str3.setBanji(banji);
str3.setMessage(message);
str3.setStudents(list3);
總結(jié):從服務(wù)端返回的數(shù)據(jù)一般都是第三種格式的,現(xiàn)在想一下如果student中的屬性除了name和age之外還有weigth、aihao(體重、愛好)等等很多屬性,那么代碼量又要增加了,再想一下如果返回的數(shù)據(jù)包含很多像student這樣的數(shù)組那我們Json解析的部分就真的要寫好多好多這樣無聊的代碼了,這里相應(yīng)實(shí)體類沒有貼出來。實(shí)際項(xiàng)目開發(fā)中,數(shù)據(jù)解析是很多的,這些操作如果我們自己寫就很煩人,所以實(shí)際開發(fā)中一般都是用Gson+GsonFormat(Gson庫解析Json數(shù)據(jù)+GsonFormat幫助我們快速新建實(shí)體類)
晉級篇:Gson+GsonFormat快速解析Json
最后:推薦一個(gè)網(wǎng)站在線Json校驗(yàn)可以幫助校驗(yàn)Json格式的數(shù)據(jù),非常好使
項(xiàng)目源碼:http://t.cn/R8uyrbo