Json基础概念
JavaScript Object Notation(json):JavaScript 对象表示法
- json 多用于网络数据格式化传输
- 也用于存储和交换文本信息
- 比 XML 更轻量、更快速,更易于解析
json格式示例:
{
"status": 200,
"message": "success",
"data": {
"age": 18,
"name": "李连杰",
"teaList": [
{
"className": "3-2",
"name": "李灵"
},
{
"className": "3-1",
"name": "张合"
},
{
"className": "3-3",
"name": "徐程"
}
]
}
}
Json数据类型以及表示格式
json数据是由键值对构成的,“message”: “success” ,数据之间以逗号分隔
- 键:一般用引号引起来
- 值:
– number 数字,整数或浮点数
– string 字符串,一般使用双引号
– null
– boolean 布尔值,true 或 false
– array 数组,以方括号的形式表示 [ ]
– object 对象,以大括号的形式表示 { }
详细参考上面示例
Json解析
Gson解析
-
导入jar包【下载链接】
-
创建Gson实例
// 用于输出紧凑格式的json,对象字段以及JSON输出中数组内的对象等之间将没有空格
Gson gson = new Gson();
// 紧凑格式的json难以阅读,Gson提供了一个美化格式的类来进行转换
Gson gsonBuilder = new GsonBuilder().setPrettyPrinting().create();
- 通过Gson对象解析json
List<Teacher> teaList = new ArrayList<>();
teaList.add(new Teacher("李灵", "3-2"));
teaList.add(new Teacher("张合", "3-1"));
teaList.add(new Teacher("徐程", "3-3"));
Student stu = new Student("李连杰", 18, teaList);
// 测试Java对象
System.out.println("Java对象=>" + stu);
Student[] stuArr = new Student[3];
stuArr[0] = new Student("张三", 18, teaList);
stuArr[1] = new Student("李四", 22, teaList);
stuArr[2] = new Student("王五", 20, teaList);
// 测试Java数组
System.out.println("Java数组=>-------------");
for (Student s : stuArr) {
System.out.println(s);
}
System.out.println("----------------------");
Java对象 –> JSON字符串
// Java对象 –-> Json字符串
String json = gson.toJson(stu);
String jsonBuilder = gsonBuilder.toJson(stu);
System.out.println("紧凑的json字符串->" + json);
System.out.println("美化的json字符串->" + jsonBuilder);
Json字符串 –> Java对象
// Json字符串 -–> Java对象
// json字符串:{"name":"周星星","age":28,"teaList":[{"name":"李分灵","className":"3-2"},{"name":"张德合","className":"3-1"},{"name":"徐发程","className":"3-3"}]}
String str = "{\"name\":\"周星星\",\"age\":28,\"teaList\":[{\"name\":\"李分灵\",\"className\":\"3-2\"},{\"name\":\"张德合\",\"className\":\"3-1\"},{\"name\":\"徐发程\",\"className\":\"3-3\"}]}";
Student student = gson.fromJson(str, Student.class);
// 测试打印
System.out.println("转换的Java对象属性->" + student.getName());
Java数组对象 –> Json字符串
// Java数组对象 --> Json字符串
String json = gson.toJson(stuArr);
System.out.println("紧凑的json字符串->" + json);
Json字符串 –> Java数组对象
// Json字符串 --> Java数组对象
// json字符串:[{"name":"张三","age":18},{"name":"李四","age":22},{"name":"王五","age":20}]
str = "[{\"name\":\"张三\",\"age\":18},{\"name\":\"李四\",\"age\":22},{\"name\":\"王五\",\"age\":20}]";
Student[] students = gson.fromJson(str, Student[].class);
// 测试打印
System.out.println("转换的Java数组=>-------------");
for (Student s : students) {
System.out.println(s);
}
System.out.println("---------------------------");
Json字符串 –> Java_List对象
// Json字符串 --> Java_List对象
// json字符串:[{"name":"张三","age":18},{"name":"李四","age":22},{"name":"王五","age":20}]
List<Student> list = gson.fromJson(str, new TypeToken<ArrayList<Student>>() {}.getType());
// 测试打印
System.out.println("转换的Java集合:" + list);
Json字符串转Java_Set跟List相同,后不再示例
Null值处理
Gson中实现的默认行为是忽略空对象字段。
- 如何在序列化时允许空值
使用GsonBuilder对象的serializeNulls()
Gson gson = new GsonBuilder().serializeNulls().create();
FastJson解析
-
导入jar包,下载链接
-
直接解析json即可
// Java对象转JSON串
String jsonString = JSON.toJSONString(stu);
System.out.println("jsonString:" + jsonString);
// JSON串转Java对象
Student student = JSON.parseObject(jsonString, Student.class);
System.out.println("student:" + student);
// Java数组转JSON串
String jsonString2 = JSON.toJSONString(stuArr);
System.out.println("jsonString2:" + jsonString2);
// JSON串转Java集合
// jsonString = [{"name":"张三","age":18},{"name":"李四","age":22},{"name":"王五","age":20}]
String jsonString3 = "[{\"name\":\"张三\",\"age\":18},{\"name\":\"李四\",\"age\":22},{\"name\":\"王五\",\"age\":20}]";
JSON.parseArray(jsonString3, Student.class);
List<Student> stuList = JSON.parseArray(jsonString3, Student.class);
System.out.println("stuList:" + stuList);