Json解析是Android开发必须掌握的技术之一。本文讲的是我对于json解析的理解和使用。
1.简介
把对象转化为Json的时候,我们把其中的name-value按照一定的规则拼接成字符串。把Json字符串转化为对象时,利用反射获得对象当中的各个变量名(也即之前的name),然后再从Json字符串中提取出该变量名对应的值,然后赋值给该变量。也就是说,Json是通过网络传输数据的一种解决方案,toJson和fromJson是编解码方法。
2.使用
原生Android即支持Json的解析。为了说明问题,我创建一个简单的Student类:
class Student { public String name; public int age; }
然后我创建了Student的实例student:
Student student = new Student(); student.name = "hsji"; student.age = 25;
我们可以把student实例转化为Json字符串:
public String studentToJson(Student student){ StringBuilder sb = new StringBuilder(); sb.append("{"name":"") .append(student.name) .append("","age":") .append(student.age) .append("}"); return sb.toString(); }
针对student实例调用studentToJson方法后得到的Json字符串为{"name":"hsji","age":25}。
也可以上面的Json字符串再转化为对象实例:
public Student jsonTOStudent(String json){ Student student = new Student(); try { JSONObject jsonObject = new JSONObject(json); student.name = jsonObject.getString("name"); student.age = jsonObject.getInt("age"); return student; } catch (JSONException e) { e.printStackTrace(); return null; } }
3.进阶
在实际的工作当中我没有使用上面的方法处理json数据,而是使用了"gson-2.2.4.jar"。这是谷歌提供的专门用来处理Json数据的jar包,网上可以很方便的搜到。
引入这个jar包之后,我们的工作变得轻松起来。下面还是通过具体的使用来说明。
还是使用上面student实例,我们通过jar包提供的方法把它转化为Json字符串:
Gson gson = new Gson(); String json = gson.toJson(student);
把Json字符串转化为对象:
Gson gson = new Gson(); String json = gson.toJson(student); Student studentCopy = gson.fromJson(json,Student.class);
通过上面示例我们可以发现使用jar包之后,处理Json数据方便了很多。
接下来通过示例说一下如何操作复杂的对象:
首先创建对象类:
class Student { public String name; public int age; } class Teacher { public String name; public boolean isHeadTeacher; } class Group{ public int no; public ArrayList<Student> students; public Teacher teacher; }
我们看到Group这个类里面有一个组标号,一个学生列表,有一个老师。
下面我们创建这个组的实例:
Group group = new Group(); group.no = 1; Student student1 = new Student(); student1.name = "李雷"; student1.age = 13; Student student2 = new Student(); student2.name = "韩梅梅"; student2.age = 13; ArrayList<Student> students = new ArrayList<>(); students.add(student1); students.add(student2); group.students = students; Teacher teacher = new Teacher(); teacher.name = "Miss Gao"; teacher.isHeadTeacher = false; group.teacher = teacher;
然后把它转化为Json字符串:
String groupJson = gson.toJson(group);
再把Json字符串转化为实例对象:
String groupJson = gson.toJson(group); Group groupCopy = gson.fromJson(groupJson,Group.class);
解析列表也是工作中遇到比较多的情况。下面介绍一下如何使用jar包来解析列表。上面把group转化为Json字符串之后,得到groupJson字符串,接下来我们就从该字符串当中取出students列表。
try { JSONObject jsonObject = new JSONObject(groupJson); String studentsJson = jsonObject.opt("students")+""; ArrayList<Student> sList = gson.fromJson(studentsJson, new TypeToken<ArrayList<Student>>(){}.getType()); } catch (JSONException e) { e.printStackTrace(); }
ok,完工!