JSON
:(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。目前,Json处于数据交换语言的王者地位.
Json的数据本身是数组,中括号包裹,数组的元素之间逗号分开.数组元素的数据类型没有限制.
var jsonArray = ["元素1","元素2","元素3"]; //定义数组格式json
console.log(jsonArray[0]); //访问json数组的元素
for(var i = 0 ; i < jsonArray.length ; i++){
console.log(jsonArray[i]); //遍历数组,访问每个元素
}
Json的数据本身是对象,大括号包裹.对象采用键值对形式存储,键固定为字符串类型,值是任意类型的数据.键和值使用冒号分开.
var jsonObject = {"k1":"v1","k2":"v2","k3":"v3"}; //定义对象格式json
console.log(jsonObject.k1); //取出键k1对应的值
var jsonArray = [
{"k1":"v1"},{"k2":"v2"}
]; // 定义数组格式json,数组元素是对象
console.log(jsonArray[0].k1); //访问数组0索引的元素,该元素的键k1对应的值
var jsonObject = {
"k1":["元素1","元素2"],
"k2":["元素1","元素2"]
}; // 定义对象格式json,键是字符串类型,值是数组
console.log(jsonObject.k1[0]); //访问对象的键是k1,对于的值为数组,数组的0索引元素
var json = {
"k1":[
"元素1",{"key1":"value1"},{"key2":"value2"}
],
"k2":[
{"key1":"value1"}
]
}; //定义对象格式json,键是字符串,值是数组,数组的元素是对象
console.log(json.k1[1].key1); //访问json对象的键k1,对应的是数组,访问数组的1索引,数组的1索引上的元素是对象,访问key1键对应的值
fastjson
是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
Fastjson 源码地址:https://github.com/alibaba/fastjson
Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.79version>
dependency>
序列化 : 是指将
Java对象
转成json格式字符串
的过程.JavaBean对象,List集合对象,Map集合,为应用最广泛的.
JSON.toJSONString
Person JavaBean
)@Test
public void objectToJson() {
Student student = new Student();
student.setId(1);
student.setName("张三");
student.setAge(20);
student.setAddress("北京市");
student.setEmail("[email protected]");
String jsonString = JSON.toJSONString(student);
System.out.println(jsonString);
}
输出结果为:
{
"address": "北京市",
"age": 20,
"email": "[email protected]",
"id": 1,
"name": "张三"
}
JSON.toJSONString
@Test
public void listToJson(){
Student student = new Student();
student.setId(1);
student.setName("张三");
student.setAge(20);
student.setAddress("北京市");
student.setEmail("[email protected]");
Student student2 = new Student();
student2.setId(2);
student2.setName("张三2");
student2.setAge(22);
student2.setAddress("北京市2");
student2.setEmail("[email protected]");
List<Student> list = new ArrayList<Student>();
list.add(student);
list.add(student2);
String jsonString = JSON.toJSONString(list);
System.out.println(jsonString);
}
输出结果为:
[
{
"address": "北京市",
"age": 20,
"email": "[email protected]",
"id": 1,
"name": "张三"
},
{
"address": "北京市2",
"age": 22,
"email": "[email protected]",
"id": 2,
"name": "张三2"
}
]
JSON.toJSONString
@Test
void testToJSONString() {
// 创建集合
List<Person> personList = new ArrayList<>();
// 添加数据
Collections.addAll(personList,
new Person(15, "张", "张三", new Date()),
new Person(21, "李", "李四", new Date()));
// 打印数据
System.out.println(JSON.toJSONString(personList));
}
输出结果为:
{
"s1": {
"address": "北京市",
"age": 20,
"email": "[email protected]",
"id": 1,
"name": "张三"
},
"s2": {
"address": "北京市2",
"age": 22,
"email": "[email protected]",
"id": 2,
"name": "张三2"
}
}
我们可以使用
JSON.parseObject()
将 JSON 字符串转换为 Java 对象,代码如下:
JSON.parseObject
@Test
public void jsonToObject() {
String jsonString = "{\"address\":\"北京市\",\"age\":20,\"email\":\"[email protected]\",\"id\":1,\"name\":\"张三\"}";
Student student = JSON.parseObject(jsonString, Student.class);
System.out.println(student);
}
输出结果为:
JSON.parseArray
@Test
public void jsonToList() {
String jsonString = "[{\"address\":\"北京市\",\"age\":20,\"email\":\"[email protected]\",\"id\":1,\"name\":\"张三\"},{\"address\":\"北京市2\",\"age\":22,\"email\":\"[email protected]\",\"id\":2,\"name\":\"张三2\"}]";
List<Student> list = JSON.parseArray(jsonString, Student.class);
for (int i = 0; i < list.size(); i++) {
Student student = list.get(i);
System.out.println(student);
}
}
输出结果为:
JSON.parseObject
@Test
public void jsonToMap() {
String jsonString = "{\"s1\":{\"address\":\"北京市\",\"age\":20,\"email\":\"[email protected]\",\"id\":1,\"name\":\"张三\"},\"s2\":{\"address\":\"北京市2\",\"age\":22,\"email\":\"[email protected]\",\"id\":2,\"name\":\"张三2\"}}";
Map<String, Student> parse = JSON.parseObject(jsonString, new TypeReference<Map<String, Student>>() {
});
for (String s : parse.keySet()) {
System.out.println(s + ":::" + parse.get(s));
}
}
输出结果为:
该注解作用于
方法上
,字段上
和参数上
.可在序列化和反序列化时进行特性功能定制.
public @interface JSONField {
// 配置序列化和反序列化的顺序,1.1.42版本之后才支持
int ordinal() default 0;
// 指定字段的名称
String name() default "";
// 指定字段的格式,对日期格式有用
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}
字段上
:可以在字段上使用 @JSONField 注解来指定字段的序列化和反序列化的行为,例如:public class User {
@JSONField(name = "id")
private Long userId;
@JSONField(format = "yyyy-MM-dd")
private Date birthDate;
// getters and setters
}
方法上
:可以在 getter 或者 setter 方法上使用 @JSONField 注解来控制对应字段的序列化和反序列化行为,例如:public class User {
private Long userId;
private String username;
@JSONField(name = "id")
public Long getUserId() {
return userId;
}
@JSONField(name = "id")
public void setUserId(Long userId) {
this.userId = userId;
}
// getters and setters for other fields
}
该注解作用于
类上
,对该类的字段进行序列化和反序列化时的特性功能定制.
SerializerFeature
是 Fastjson 序列化库提供的一组枚举常量
,用于配置 JSON 序列化过程中的不同特性和选项。通过在序列化时传递相应的 SerializerFeature 常量,可以根据需求自定义序列化行为。
WriteMapNullValue
序列化为null的字段@Test
public void testSerializerFeature() {
Student student = new Student();
student.setId(1);
student.setName("张三");
student.setAge(20);
//student.setAddress("北京市");
student.setEmail("[email protected]");
String jsonString = JSON.toJSONString(student, SerializerFeature.WriteMapNullValue);
System.out.println(jsonString);
}
输出结果为:
WriteNullStringAsEmpty
字段为null,序列化为""
@Test
public void testSerializerFeature() {
Student student = new Student();
student.setId(1);
student.setName("张三");
student.setAge(20);
//student.setAddress("北京市");
student.setEmail("[email protected]");
String jsonString = JSON.toJSONString(student, SerializerFeature.WriteNullStringAsEmpty);
System.out.println(jsonString);
}
输出结果为:
WriteNullNumberAsZero
字段为null,序列化为0
@Test
public void testSerializerFeature() {
Student student = new Student();
student.setId(1);
student.setName("张三");
//student.setAge(20);
student.setAddress("北京市");
student.setEmail("[email protected]");
String jsonString = JSON.toJSONString(student, SerializerFeature.WriteNullNumberAsZero);
System.out.println(jsonString);
}
输出结果为:
PrettyFormat
格式化输出@Test
public void testSerializerFeature2() {
Person person = new Person();
//person.setFlag(true);
person.setDate(new Date());
String jsonString = JSON.toJSONString(person, SerializerFeature.WriteNullBooleanAsFalse,
SerializerFeature.WriteDateUseDateFormat, SerializerFeature.PrettyFormat);
System.out.println(jsonString);
}
输出结果为:
枚举常量 WriteNullBooleanAsFalse
字段值为null 输出false
枚举常量 WriteDateUseDateFormat
格式化日期格式
创建 JSON 对象非常简单,只需使用
JSONObject
(fastJson提供的json对象) 和JSONArray
(fastJson提供json数组对象) 对象即可。
我们可以把JSONObject 当成一个 Map
来看,只是 JSONObject 提供了更为丰富便捷的方法,方便我们对于对象属性的操作。我们看一下源码:
同样我们可以把 JSONArray 当做一个List
,可以把 JSONArray 看成 JSONObject 对象的一个集合,查看源码:
此外,由于
JSONObject
和JSONArray
继承了JSON
,所以说也可以直接使用两者对 JSON 格式字符串与 JSON 对象及 javaBean 之间做转换。
@Test
void testJSONArrayAndJSONObject(){
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < 2; i++) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("age",21);
jsonObject.put("name","jeck"+i);
jsonObject.put("dateOfBirth","2023-12-22 12:12:12");
jsonArray.add(jsonObject);
}
System.out.println(jsonArray.toJSONString());
}
输出结果为:
[
{
"name": "jeck0",
"dateOfBirth": "2023-12-22 12:12:12",
"age": 21
},
{
"name": "jeck1",
"dateOfBirth": "2023-12-22 12:12:12",
"age": 21
}
]