Json解析总结

2018-02-27 11:31:12来源:https://www.jianshu.com/p/d11275db2344作者:萌力觉醒人点击

分享



前言:在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








最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台