FastJson

目录

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());
    }
}
上一篇:OCP学习笔记-007 SQL语言之三:DDL


下一篇:智能电网与微电网:引领电力未来的创新力量