JSON
定义:JavaScript Object Notation 的缩写。javaScript对象标识符。
主要用于前后端数据传输的一种数据封装格式。
Json的数据类型
数据结构
-
对象类型 : Object
{}: 使用花括号来表示 【内部是键值对的格式,key必须是string类型,value可以是基本类型,也可以是数据结构类型】。
-
数组类型 : Array
- 数组 / 对象数组类型
[{},{},{},...]: 所有的对象包裹在中括号内部,多个元素之间使用逗号分隔。
基本数据类型
- 字符串类型 : string
- 数值类型 : number
- 真类型 : true
- 假类型 : false
- 空类型 : null
示例:
[
{"id":1001,"name":"张3丰","age":100,"girlfriend":false,"car":null,
"hobby":
["练功","喝酒"]
},
{"id":1002,"name":"张5忌","age":7,"girlfriend":false,"car":null,
"hobby":
["抽烟","喝酒"]
},
{"id":1003,"name":"猪8戒","age":700,"girlfriend":false,"car":null,
"hobby":
["吃","睡"]
}
]
FastJson API
是阿里巴巴开源的JSON解析库,主要有两个功能:
- 将对象转换为Json字符串,这个过程称之为序列化。参数为对象。
- 将Json字符串转换为对象,这个过程称之为反序列化。参数为Json文本。
数据准备
Java Bean对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private String name;
private String gender;
private int age;
}
FastJson 序列化 API
-
将对象、List集合、Map集合序列化为JSON文本
public static final String
toJSONString
(Object object);public static final String
toJSONString
(List list);public static final String
toJSONString
(Map map);public class TestJson { public static void main(String[] args) { Student stu1 = new Student("张三", "男", 13); Student stu2 = new Student("李四", "女", 14); Student stu3 = new Student("王五", "男", 15); ArrayList<Student> list = new ArrayList<>(); list.add(stu1); list.add(stu2); list.add(stu3); // TODO 1. 单个对象序列化为JSON文本 String stu1Json = JSON.toJSONString(stu1); //{"age":13,"gender":"男","name":"张三"} System.out.println(s1); // TODO 2. 集合序列化为JSON文本 String listJson = JSON.toJSONString(list); //[{"age":13,"gender":"男","name":"张三"},{"age":14,"gender":"女","name":"李四"},{"age":15,"gender":"男","name":"王五"}] System.out.println(listJson); HashMap<String, Student> map = new HashMap<>(); map.put("student1",stu1); map.put("student2",stu2); map.put("student3",stu3); String mapJson = JSON.toJSONString(map); /* {"student2":{"age":14,"gender":"女","name":"李四"}, "student1":{"age":13,"gender":"男","name":"张三"}, "student3":{"age":15,"gender":"男","name":"王五"}} */ System.out.println(mapJson); } }
-
将对象、List集合、Map集合序列化为带格式的JSON文本
public static final String
toJSONString
(Object object, boolean prettyFormat);public static final String
toJSONString
(List list, boolean prettyFormat);public static final String
toJSONString
(Map map, boolean prettyFormat);// TODO 3. 将对象序列化为带格式的JSON文本 String result = JSON.toJSONString(stu1, true); /* { "age":13, "gender":"男", "name":"张三" } */ System.out.println(result);
-
将对象、集合序列化为JSONObject或者JSONArray。
JSONObject 和 Object是不一样的:
JSONObject 是Json对象,其实就是Json数据:
{“name”:“张三”,“gender”:“男”,“age”:13}Object就是一个Java对象:
Student(name=张三, gender=男, age=13)public static final Object
toJSON
(Object javaObject);public static final Object
toJSON
(List list);// TODO 4. 将对象序列化为JSONObject或者JSONArray。 Object result1 = JSON.toJSON(stu3); // {"gender":"男","name":"王五","age":15} System.out.println(result1); Object listJson3 = JSON.toJSON(list); // [{"gender":"男","name":"张三","age":13},{"gender":"女","name":"李四","age":14},{"gender":"男","name":"王五","age":15}] System.out.println(listJson3);
FastJson 反序列化 API
-
把JSON文本反序列化为JSONObject或者JSONArray
public static final Object parse(String json);
-
把JSON文本反序列化成JSONObject
public static final JSONObject
parseObject
(String json);String json = "{\"age\":13,\"gender\":\"男\",\"name\":\"张三\"}"; JSONObject result3 = JSON.parseObject(json); // {"gender":"男","name":"张三","age":13} System.out.println(result3);
如果JSONObject是嵌套数据格式(即map集合):
{“student”: {“name”: “张三”,“gender”: “男”,“age”: 13},“teacher”: {“name”: “霍元甲”,“gender”: “男”,“age”: 57}}。
那么就可以通过result3.getJSONObject(“student”)获取数据,返回值仍然 是JSON对象类型。
但是也可以通过result3.getString(“student”)获取数据,此时的返回值是String类型。 -
把JSON文本反序列化为JavaBean
public static final T
parseObject
(String json, Class clazz);String json = "{\"age\":13,\"gender\":\"男\",\"name\":\"张三\"}"; Student student = JSON.parseObject(json, Student.class); // Student(name=张三, gender=男, age=13) System.out.println(student);
-
把JSON文本反序列化为JSONArray
public static final JSONArray parseArray(String json);
-
把JSON文本反序列化为JavaBean集合
public static final <T> List<T> parseArray(String json, Class<T> clazz);