JSON : JavaScript Object Notation
JSON 是一种轻量级,纯文本的数据交互格式 , 独立与编程语言 , 几乎所有主流语言(Java,Python,JS,GO)都支持解析和生成
1. 基础语法 :
- 数据以键值对形式存在 , 键必须为双引号
- 数据之间使用逗号分隔
- { }表示对象 , [ ] 表示数组
- 支持数据类型 : 字符串 , 数组 , 布尔值 , null , 对象 , 数组
- 不支持注释 , 函数 , undefined
2. 两种数据结构 :
- 对象 : 大括号 { } 保存的对象是一个 无序的键值对 集合 , 一个对象 左括号{ 开始 , 右括号 } 结束 , 每个 键 后跟一个冒号 , 键值对使用逗号分隔
- 数组 : 中括号 [ ] 保存的数组是值(value)的有序集合 , 一个数组以左括号 [ 开始 , 右括号 ] 结束 , 值之间使用逗号分隔
简单示例 :
javascript
{
"name": "小明",
"age": 20,
"isStudent": true,
"hobbies": ["读书", "编程"],
"address": {
"city": "北京",
"district": "海淀"
},
"score": null
}

3.JSON 字符串和 Java 对象互传
在 Java 中 , 最成熟的 JSON 处理库有 3 个 : Jackson(Spring 框架内置) , Gson(google) , Fastjson(阿里)
下面以 Jackson 为例 :
java
public class UserInfo {
private String name;
private int gender;
private int age;
public UserInfo() {
}
public UserInfo(String name, int gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "UserInfo{" +
"name='" + name + '\'' +
", gender=" + gender +
", age=" + age +
'}';
}
}
注意 : 如果不用 Lombok , 必须手动编写 无参构造器和所有属性的 get/set 方法 , 否则 Jackson 无法正常解析
①Java 对象 ->JSON 字符串(序列化)
序列化 : 使用 objectmapper.writeVakueAsString(Java 对象) -> 生成 JSON 字符串
java
//java->json
private static final ObjectMapper objectmapper = new ObjectMapper();
public static void main(String[] args) {
//创建json对象
UserInfo s1 = new UserInfo("张三",1,18);
//序列化
String str1 = objectmapper.writeValueAsString(s1);
System.out.println(str1);
}

②JSON 字符串->Java 对象
反序列化 : objectmapper.readValue(Json 字符串 , 目标类.class)
java
private static final ObjectMapper objectmapper = new ObjectMapper();
public static void main(String[] args) {
//Json字符串
String jstr1 = "{\"name\":\"张三\",\"gender\":1,\"age\":18}";
//反序列化
UserInfo s1 = objectmapper.readValue(jstr1,UserInfo.class);
System.out.println(s1);
}

③ 处理集合类型
如果需要转换集合 , 需要用 TypeReference 指定泛型类型
java
private static final ObjectMapper objectmapper = new ObjectMapper();
public static void main(String[] args) {
//json数组字符串
String jsonArrStr = "[{\"name\":\"张三\",\"gender\":1,\"age\":18},{\"name\":\"李四\",\"gender\":1,\"age\":98}]";
//反序列化为List<UserInfo>
List<UserInfo> list = objectmapper.readValue(jsonArrStr, new TypeReference<List<UserInfo>>() {
@Override
public Type getType() {
return super.getType();
}
});
list.forEach(System.out::println);
}
