前言:在Android开发中我们避免不了从服务端获取数据,而服务端返回的数据基本上都是Json格式的,今天乘着公司不忙,特地总结一下Json的几种解析方式。
一、Json是什么?
JSON是一种取代XML的数据结构,和xml相比,它更小巧但是性能仍然很好,由于它的小巧所以网络传输数据使用的流量更少,传输的速度更快。JSON就是一串字符串 只不过元素会使用特定的符号标注。
Json语法:
- {} 双括号表示对象
- [] 中括号表示数组
- "" 双引号内是属性或值
- : 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
所以 {"name": "张三"} 可以理解为是一个包含name为张三的对象
而[{"name": "张三"},{"name": "李四"}]就表示包含两个对象的数组
当然了,你也可以使用{"name":["Michael","Jerry"]}来简化上面的步骤,这是一个拥有一个name数组的对象
二、Json怎么用?
生成json数据(这里只是简单生成了一个Json对象,这里我们重点放在Json解析上)
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "张三");
jsonObject.put("age",18);
三、Json解析
这里三种方式难度依次递进,掌握了前两种几乎就掌握了第三种,练习好了第三种以后碰到即使很复杂的数据也是这种套路,亲测没毛病!
①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数组解析
/*
[
{"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对象和数组解析
/*
{
"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集合进行解析
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);
总结:从服务端返回的数据一般都是第三种格式的,现在想一下如果student中的属性除了name和age之外还有weigth、aihao(体重、爱好)等等很多属性,那么代码量又要增加了,再想一下如果返回的数据包含很多像student这样的数组那我们Json解析的部分就真的要写好多好多这样无聊的代码了,这里相应实体类没有贴出来。实际项目开发中,数据解析是很多的,这些操作如果我们自己写就很烦人,所以实际开发中一般都是用Gson+GsonFormat(Gson库解析Json数据+GsonFormat帮助我们快速新建实体类)
晋级篇:Gson+GsonFormat快速解析Json
最后:推荐一个网站在线Json校验可以帮助校验Json格式的数据,非常好使
项目源码:http://t.cn/R8uyrbo