JSON
内容:概念、使用、解析、封装对象
一、概念:JavaScript Object Notation (JavaScript 对象表示法),轻量级的文本数据交换格式
JSON 是存储和交换文本信息的语法。类似 XML。
JSON 比 XML 更小、更快,更易解析。
二、json数据格式:
1、json对象:{ m:z,m:z,m:z,m,z } 括号中由多个名值对组成,每个名值队之间用逗号隔开,名值之间用冒号隔(名,值类型没有明确规定)
2、json数组:{ “team”:[“a”,“b”,“c”,“d”] }
{ \"stus\":[ {\"id\":1234,\"name\":\"张三\",\"age\":21,\"sex\":\"男\"},{\"id\":2345,\"name\":\"李四\",\"age\":22,\"sex\":\"男\"},{\"id\":3456,\"name\":\"王五\",\"age\":23,\"sex\":\"女\"},{\"id\":4567,\"name\":\"小黑\",\"age\":18,\"sex\":\"男\"},{\"id\":5678,\"name\":\"小白\",\"age\":32,\"sex\":\"女\"},{\"id\":6789,\"name\":\"小灰\",\"age\":22,\"sex\":\"男\"}]}
3、JSON 与 XML 相同之处:JSON 和 XML 数据都是 “自我描述” ,易于理解,数据都是有层次的结构,JSON 和 XML 数据可以被大多数编程语言使用。
-
4、JSON 与 XML 的不同之处:JSON 不需要结束标签、JSON 更加简短、JSON 读写速度更快、JSON 可以使用数组。
-
最大的不同是:XML 需要使用 XML 解析器来解析,JSON 可以使用标准的 JavaScript 函数来解析。
三、json解析:在javaScript中可以直接解析,但是在java中无法直接解析,需要依赖第三方解析器(GSON、fastjson…)
使用GSION解析json:
3.1 导入GSON jar包:
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version></dependency>
3.2 、单条无嵌套Json数据的解析
比如有如下Json数据:{“name”:“John”, “age”:20} //也可以用单引号,写成:{‘name’:‘John’, ‘age’:20}
解析该数据步骤如下:
3.2.1、定义Person类:
public class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
3.2.2、创建GSON对象并解析:
String jsonData = \"{\\\"name\\\":\\\"John\\\", \\\"age\\\":20}\";//注:这里也可以不使用转义字符,而用单引号:String jsonData = \"{\'name\':\'John\', \'age\':20}\";Gson gson=new Gson();Person person = gson.fromJson(jsonData,Person.class);
3.2.3、然后使用Person对象的getter方法就可以获取到数据了。
3.2.4、扩展:考虑到Json数据的不同,那么解析Json的时候所用的类也可能不同,比如这里用的是Person,如果解析其他数据可能用的又是Dog、Cat…所以考虑将用GSON解析的步骤封装,并提供泛型参数,示例程序如下:
package com.aurora;import com.google.gson.Gson;/*** 用GSON解析单条Json数据*/public class Text {public static void main(String[] args) {String jsonData = \"{\'name\':\'John\', \'age\':20}\";Person person = GsonUtil.parseJsonWithGson(jsonData, Person.class);System.out.println(person.getName() + \",\" + person.getAge());}}/*** 封装的GSON解析工具类,提供泛型参数*/class GsonUtil {//将Json数据解析成相应的映射对象public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {Gson gson = new Gson();T result = gson.fromJson(jsonData, type);return result;}}
3.3、单条有嵌套的Json数据解析
如下Json数据:{“name”:“John”, “age”:20,“grade”:{“course”:“English”,“score”:100,“level”:“A”}}对这样的数据就要用内部类的来解决了。解析步骤如下:
3.3.1、定义Student类:
package com.aurora;/*** @Author aurora* @Description 学生类* @Date 2020-08-08 16:36* @Param* @Return**/public class Student {private String name;private String age;private Grade grade;public class Grade { // 内部类要定义成public的private String course;private String score;private String level;public String getCourse() {return course;}public void setCourse(String course) {this.course = course;}public String getScore() {return score;}public void setScore(String score) {this.score = score;}public String getLevel() {return level;}public void setLevel(String level) {this.level = level;}// 重写toString方法@Overridepublic String toString() {return \"Grade:[course = \" + course + \", score = \" + score+ \", level = \" + level + \"]\";}}// 重写toString方法@Overridepublic String toString() {return \"Student:[name = \" + name + \", age = \" + age + \", grade = \"+ grade + \"]\";}}}
3.3.2、使用工具类进行解析
public static void main(String[] args) {String jsonData = \"{\'name\':\'John\', \'age\':20,\'grade\':{\'course\':\'English\',\'score\':100,\'level\':\'A\'}}\";Student student = GsonUtil.parseJsonWithGson(jsonData, Student.class);System.out.println(student);}
3.4、解析Json数组(多条Json数据)比如有如下Json数据:
[{‘name’:‘John’, ‘grade’:[{‘course’:‘English’,‘score’:100},{‘course’:‘Math’,‘score’:78}]}, {‘name’:‘Tom’, ‘grade’:[{‘course’:‘English’,‘score’:86},{‘course’:‘Math’,‘score’:90}]}] //注:Json数组最外层一定要加\”[]\”
如何处理这样的数据呢?就要用到List。步骤如下:
package com.aurora;import java.util.List;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;/*** 用GSON解析Json数组*/public class GsonTest {public static void main(String[] args) {// Json数组最外层要加\"[]\"String jsonData = \"[{\'name\':\'John\', \'grade\':[{\'course\':\'English\',\'score\':100},{\'course\':\'Math\',\'score\':78}]},{\'name\':\'Tom\', \'grade\':[{\'course\':\'English\',\'score\':86},{\'course\':\'Math\',\'score\':90}]}]\";List<Student> students = GsonUtil.parseJsonArrayWithGson(jsonData,Student.class);System.out.println(students);}}/** 封装的GSON解析工具类,提供泛型参数*/class GsonUtil {// 将Json数据解析成相应的映射对象public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {Gson gson = new Gson();T result = gson.fromJson(jsonData, type);return result;}// 将Json数组解析成相应的映射对象列表public static <T> List<T> parseJsonArrayWithGson(String jsonData,Class<T> type) {Gson gson = new Gson();List<T> result = gson.fromJson(jsonData, new TypeToken<List<T>>() {}.getType());return result;}}class Student {private String name;private List<Grade> grade; // 因为grade是个数组,所以要定义成Listpublic class Grade {private String course;private String score;public String getCourse() {return course;}public void setCourse(String course) {this.course = course;}public String getScore() {return score;}public void setScore(String score) {this.score = score;}}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Grade> getGrade() {return grade;}public void setGrade(List<Grade> grade) {this.grade = grade;}}