目录
FastJson
新建一个SpringBoot项目
pom.xml
一、JavaBean与JSON数据相互转换
LoginController
FastJsonApplication启动类
编辑二、FastJson的@JSONField注解
Log实体类
TestLog测试类
三、FastJson对JSON数据的增、删、改、查
TestCrud
FastJson
- 1、JSON使用手册:JSON 教程 | (runoob.com)
- 2、FastJson官方文档:Quick Start CN · alibaba/fastjson Wiki (github.com)
- 3、
- JSON(JavaScript Object Notation, JavaScript 对象标记法),是一种轻量级的数据交换格式。
- 对于一个前后端分离的SpringBoot项目而言,前端需要的是以“键:值”结构保存的JSON数据,后端需要的是JavaBean。所以出现了两种JSON解析库,把它们转来转去,以便前后端进行数据交流:
- 1、Spring Boot内置的Jackson(适合场景复杂、业务量大的项目)
- 2、阿里巴巴开发的FastJson(适合数据量小、并发量小的项目)
- FastJson是JSON解析库,用于转换JavaBean和JSON数据
- 序列化(将Java对象转换为JSON字符串)
反序列化(将JSON字符串转换为Java对象)
String text = JSON.toJSONString(obj); //序列化 VO vo = JSON.parseObject("{...}", VO.class); //反序列化 //VO:与JSON数据对应的实体类
- @
JSONField注解:
- 当你需要更精确地控制Java对象的字段在序列化和反序列化过程中的行为时,可以使用
@JSONField
注解@JSONField注解可以用于声明类、属性或方法
该注解可以让人重新定制序列化规则
- 增删改查:
- FastJSON将JSON数据分成“对象”和“数组”两种形式,
- 把对象节点封装成JSONObject类,
- 把数组节点封装成JSONArray类,
- 然后利用这两个类对JSON数据进行增、删、改查操作
新建一个SpringBoot项目
项目结构:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.study</groupId>
<artifactId>fastJson</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>fastJson</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--添加FastJSON依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<!--使用@Test注解-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
一、JavaBean与JSON数据相互转换
LoginController
- 接收前端发来的JSON数据,返回JSON登录结果
package com.study.fastJson.controller;
import com.alibaba.fastjson.JSON;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* 接收前端发来的JSON数据,返回JSON登录结果
*/
@RestController
public class LoginController {
@RequestMapping("/login")
public String login(@RequestBody String json){
//将请求体中的字符串以JSON格式读取并转换为Map键值对象
Map loginDate=JSON.parseObject(json,Map.class);
//读取JSON中的账号
String username=loginDate.get("username").toString();
//读取JSON中的密码
String password=loginDate.get("password").toString();
HashMap<String, String> result = new HashMap<>();
//返回的响应码
String code="";
//返回的响应信息
String message="";
if("mr".equals(username) && "123456".equals(password)){
code="200";
message="登录成功";
}else{
code="500";
message="账号或密码错误";
}
//将响应码和响应信息保存到result响应结果中
result.put("code",code);
result.put("message",message);
//将键值对象转换为以"键:值"结构保存的JSON数据并返回
return JSON.toJSONString(result);
}
}
FastJsonApplication启动类
package com.study.fastJson;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class FastJsonApplication {
public static void main(String[] args) {
SpringApplication.run(FastJsonApplication.class, args);
}
}
启动启动类,使用postman进行测试
二、FastJson的@JSONField注解
Log实体类
@JSONField注解的几个重要属性:
- name
- serialize
- format
- ordinal
package com.study.fastJson.entity;
import com.alibaba.fastjson.annotation.JSONField;
import java.util.Date;
/**
* @JSONField注解的各种常见用法
*/
public class Log {
//ordinal用于定义不同属性被转换后的JSON数据中的排列顺序,值越大越靠后
@JSONField(ordinal = 0,name="code")//为该属性定义别名"code"
private String id;
@JSONField(ordinal = 1,serialize = false)//该属性不会被序列化,即不显示
public String message;
@JSONField(ordinal = 2,format = "yyyy-MM-dd HH:mm:ss")//定义该属性序列化时的日期格式
public Date create;
public Log() {
}
public Log(String message, Date create, String id) {
this.message = message;
this.create = create;
this.id = id;
}
//Getter(),Setter()方法省略
}
TestLog测试类
package com.study.fastJson.entity;
import com.alibaba.fastjson.JSON;
import org.junit.Test;
import java.util.Date;
public class TestLog {
/**
* @JSONField(name="code")
* 定义属性的别名,以别名使用该属性
*/
@Test
public void testName(){
Log log = new Log();
log.setId("404");
System.out.println(JSON.toJSONString(log));
}
/**
* @JSONField(format = "yyyy-MM-dd HH:mm:ss")
* 当Log对象被转换为JSON数据时,会自动按照@JSONField注解定义的日期格式进行转换
*/
@Test
public void testDateFormat(){
Log log = new Log();
log.create=new Date();
System.out.println(JSON.toJSONString(log));
}
/**
* @JSONField(serialize = false)
* id属性不会被序列化
*/
@Test
public void testSerialize(){
Log log = new Log();
log.setId("404");
log.message="找不到资源";
System.out.println(JSON.toJSONString(log));
}
/**
* @JSONField(ordinal = 0)
* ordinal用于定义不同属性被转换后的JSON数据中的排列顺序,值越大越靠后
*/
@Test
public void testOrder(){
Log log = new Log("找不到资源",new Date(),"404");
System.out.println(JSON.toJSONString(log));
}
}
三、FastJson对JSON数据的增、删、改、查
TestCrud
package com.study.fastJson;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.junit.Test;
/**
* 使用JSONObject类和JSONArray类对JSON数据进行增删改查操作
*/
public class TestCrud {
/**
* 查询数据
* 使用get()方法查询
*/
@Test
public void getJson(){
String json="{\"name\":\"张三\",\"age\":25,\"qq\":[\"123456789\",\"987654321\"],"
+"\"scores\":{\"chinese\":90,\"math\":85}}";
//获取以"键:值"结构保存的JSON数据的对象节点
JSONObject root= JSON.parseObject(json);
//查询指定字段对应的值
String name=root.getString("name");
int age=root.getIntValue("age");
System.out.println("姓名:"+name+",年龄:"+age);
//获取JSON数组中的值
JSONArray arr=root.getJSONArray("qq");
String firstQQ=arr.getString(0);
System.out.println(firstQQ);
//获取JSON子节点中的数据
JSONObject scores=root.getJSONObject("scores");
int math=scores.getIntValue("math");
System.out.println("数学成绩为:"+math);
}
/**
* 增加数据
* 对象节点使用put()节点增加,数组节点使用add()方法增加
*/
@Test
public void addJson(){
String json="{\"name\":\"张三\",\"age\":25,\"qq\":[\"123456789\",\"987654321\"],"
+"\"scores\":{\"chinese\":90,\"math\":85}}";
//获取以"键:值"结构保存的JSON数据的对象节点
JSONObject root= JSON.parseObject(json);
root.put("sex","男");
root.getJSONArray("qq").add("999999");
root.getJSONObject("scores").put("english",92);
System.out.println(root.toJSONString());
}
/**
* 修改数据
* 对象节点使用put()方法修改,数组节点使用set()方法修改
*/
@Test
public void updateJson(){
String json="{\"name\":\"张三\",\"age\":25,\"qq\":[\"123456789\",\"987654321\"],"
+"\"scores\":{\"chinese\":90,\"math\":85}}";
//获取以"键:值"结构保存的JSON数据的对象节点
JSONObject root= JSON.parseObject(json);
root.put("name","李四");//名字改成李四
root.getJSONArray("qq").set(1,"000000");//将第二个qq号改成000000
root.getJSONObject("scores").put("math",70);//数学成绩改成70
System.out.println(root.toJSONString());
}
/**
* 删除数据
* 对象节点和数组节点都使用remove()方法删除
*/
@Test
public void removeJson(){
String json="{\"name\":\"张三\",\"age\":25,\"qq\":[\"123456789\",\"987654321\"],"
+"\"scores\":{\"chinese\":90,\"math\":85}}";
//获取以"键:值"结构保存的JSON数据的对象节点
JSONObject root= JSON.parseObject(json);
root.remove("age");//删除年龄字段
root.getJSONArray("qq").remove(0);//删除第一个qq号
root.getJSONObject("scores").remove("chinese");//删除语文成绩
System.out.println(root.toJSONString());
}
}