fastjson2使用

news2024/11/30 6:32:39

说明:fastjson2是一个性能极致并且简单易用的Java JSON库(官方语),本文介绍在Spring Boot项目中如何使用fastjson2。

创建项目

首先,创建一个Maven项目,引入fastjson2依赖,如下:

<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 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/>
    </parent>

    <groupId>com.hezy</groupId>
    <artifactId>fastjson2_demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>Archetype - fastjson2_demo</name>
    <url>http://maven.apache.org</url>

    <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>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--fastjson2依赖-->
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.50</version>
        </dependency>
    </dependencies>
</project>

创建一个实体类对象,User

import lombok.*;
import java.io.Serializable;

@Data
public class User implements Serializable {

    /**
     * id
     */
    private String id;

    /**
     * 证件号
     */
    private String cardNo;

    /**
     * 手机号
     */
    private String phone;

    /**
     * 姓名
     */
    private String name;

    /**
     * 用户名
     */
    private String username;

    /**
     * 密码
     */
    private String password;
}

这里需要注意对象需要实现Serializable 接口,表示改对象能被序列化,另外对象需要有全参构造、无参构造(@Data注解自动生成),在分布式项目中,服务之间传输对象(如Dubbo、MQ)底层实现依赖于对象的全参构造,如果对象没有全参构造方法会报错的。

还有,严格来说,对象需要设置一个序列化版本ID,不设置Java虚拟机会自动为其设置。但如果在序列化之后,有修改过对象的属性,那么Java虚拟机自动设置的序列化版本ID就会改变,这时候再去反序列化原来生成过的JavaBean数据(如文本、xml文件、缓存)就会报错。

private static final long serialVersionUID = 1L

这里只是一个Demo,就不讲究了。

使用

先创建一些变量,如下:

    static User user;

    static String userJson = "{\"id\":\"10001\",\"cardNo\":\"123456194910014896\",\"phone\":\"12345678901\",\"name\":\"hezy\",\"username\":\"hezy\",\"password\":\"123456\"}";

    static byte[] userJsonBytes = userJson.getBytes();

    static String userJsonArray = "[{\"id\":\"10001\",\"cardNo\":\"123456194910014896\",\"phone\":\"12345678901\",\"name\":\"hezy\",\"username\":\"hezy\",\"password\":\"123456\"}]";

    static {
        user = new User();
        user.setId("10001");
        user.setCardNo("123456194910014896");
        user.setPhone("12345678901");
        user.setName("hezy");
        user.setUsername("hezy");
        user.setPassword("123456");
    }

2.1将JSON解析为JSONObject

    /**
     * 2.1将JSON解析为JSONObject
     */
    @Test
    public void jsonToJSONObject() {
        JSONObject jsonObject1 = JSON.parseObject(userJson);
        System.out.println(jsonObject1);

        JSONObject jsonObject2 = JSON.parseObject(userJsonBytes);
        System.out.println(jsonObject2);
    }

在这里插入图片描述

2.2 将JSON解析为JSONArray

    /**
     * 2.2将JSON解析为JSONArray
     */
    @Test
    public void jsonToJSONArray() {
        JSONArray jsonArray = JSON.parseArray(userJsonArray);
        System.out.println(jsonArray.get(0));
    }

在这里插入图片描述

2.3 将JSON解析为Java对象

    /**
     * 2.3 将JSON解析为Java对象
     */
    @Test
    public void jsonToJavaBean() {
        User userBean = JSON.parseObject(userJson, User.class);
        System.out.println(userBean);
    }

在这里插入图片描述

2.4 将Java对象序列化为JSON

    /**
     * 2.4 将Java对象序列化为JSON
     */
    @Test
    public void javaBeanToJson() {
        String jsonString = JSON.toJSONString(user);
        System.out.println(jsonString);

        byte[] jsonBytes = JSON.toJSONBytes(userJsonBytes);
        System.out.println(jsonBytes);
    }

在这里插入图片描述

2.5 使用JSONObject、JSONArray

2.5.1 获取简单属性
    /**
     * 2.5.1 使用JSONObject、JSONArray
     * 获取简单属性
     */
    @Test
    public void getValue() {
        JSONObject jsonObject = JSON.parseObject(userJson);
        String username = jsonObject.getString("username");
        System.out.println(username);
    }

在这里插入图片描述

2.5.2 读取JavaBean
    /**
     * 2.5.2 使用JSONObject、JSONArray
     * 读取JavaBean
     */
    @Test
    public void getJavaBean() {
        JSONArray jsonArray = JSON.parseArray(userJsonArray);
        JSONObject jsonObject = JSON.parseObject(userJson);

        User userBean = jsonArray.getObject(0, User.class);
        System.out.println(userBean);

        // 这里也可以换成自定义对象,就是说支持读取对象中的对象
        String username = jsonObject.getObject("username", String.class);
        System.out.println(username);
    }

在这里插入图片描述

2.5.3 转为JavaBean
    /**
     * 2.5.3 使用JSONObject、JSONArray
     * 转为JavaBean
     */
    @Test
    public void toJavaBean() {
        JSONArray jsonArray = JSON.parseArray(userJsonArray);
        JSONObject jsonObject = JSON.parseObject(userJson);

        User user = jsonObject.toJavaObject(User.class);
        System.out.println(user);

        List<User> users = jsonArray.toJavaList(User.class);
        System.out.println(users);
    }

在这里插入图片描述

2.6 将JavaBean对象序列化为JSON

    /**
     * 2.6 将JavaBean对象序列化为JSON
     */
    @Test
    public void javaBeanObjectToJson() {
        String jsonString = JSON.toJSONString(user);
        System.out.println(jsonString);

        byte[] jsonBytes = JSON.toJSONBytes(user);
        System.out.println(jsonBytes);
    }

在这里插入图片描述

相关注解

  • @JsonIgnore:序列化时排除该属性,详情参考:排除对象属性序列化的三种方式

  • @JSONType(orders = {}):定义序列化时的属性顺序;

@Data
@JSONType(orders = {"id", "cardNo", "phone", "name", "username", "password"})
public class User implements Serializable {
	……
}

如上面2.6方法,加上上面的注解后重新启动,结果如下,序列化后属性顺序改变了:

在这里插入图片描述

  • @JSONField(name = “”):指定该属性序列化时的名称;
    /**
     * 姓名
     */
    @JSONField(name = "realName")
    private String name;

如上面2.6方法,加上注解后重新启动,结果如下,序列化后的name变为realName

在这里插入图片描述

  • @JsonFormat(pattern = “yyyy-MM-dd”, timezone = “GMT+8”):日期格式化成yyyy-MM-dd,时区为东八区;

创建一个日期属性,如下:

    /**
     * 生日
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date birthday;

赋值,当前日期

user.setBirthday(new Date());

打印序列化前后的内容

    /**
     * 2.6 将JavaBean对象序列化为JSON
     */
    @Test
    public void javaBeanObjectToJson() {
        System.out.println(user);

        String jsonString = JSON.toJSONString(user);
        System.out.println(jsonString);
    }

可以看到日期格式发生了改变

在这里插入图片描述

总结

集中去看API毫无意义,因为看了、敲了,用的时候也会忘,而且这些API名称看起来都差不多,不好区分。用的时候再去查(源码、百度、GPT)也都来得及,后面的注解值得一看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1667839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows使用cowaxess(goaccess)分析Nginx日志

原文网址&#xff1a;Windows使用cowaxess(goaccess)分析Nginx日志_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Windows安装cowaxess来分析Nginx的access.log日志的方法。 cowaxess是goaccess的Windows版本&#xff0c;cowaxess底层会调用goaccess。 GoAccess 是一个专门用来…

使用迭代器进行遍历时不能进行元素的任何修改

记录一下 使用迭代器进行遍历时不能进行元素的任何修改 ArrayList<String> list new ArrayList<>();list.add("一");list.add("二");list.add("光");list.add("华"); // 遍历器Iterator<String> iterator …

如何使用活字格批量导入照片到数据表

活字格是一款功能强大的电子表格软件&#xff0c;除了基本的表格计算功能之外&#xff0c;还提供了丰富的扩展功能&#xff0c;可以用来实现各种自动化操作。例如&#xff0c;我们可以使用活字格来批量导入照片到数据表中。 以下是具体的操作步骤&#xff1a; 在活字格工作表…

rust开发web服务器框架,github排名对比

Rocket Star最多的框架 github仓库地址&#xff1a;GitHub - rwf2/Rocket: A web framework for Rust. Rocket 是一个针对 Rust 的异步 Web 框架&#xff0c;重点关注可用性、安全性、可扩展性和速度。 Axum 异步运行时 githuh仓库地址&#xff1a;GitHub - tokio-rs/axum: …

C++入门系列-拷贝构造函数

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 拷贝构造函数 概念 在创建对象的时候&#xff0c;能不能创建一个和已知已存在的对象一模一样的对象呢&#xff1f; 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参…

飞书API(8):MySQL 入库定制版本

一、引入 通用版能解决百分之八九十的任务&#xff0c;剩下的部分任务需要进行定制。 先说明通用版本和定制版本有什么不同&#xff0c;通用版本就是只管大的数据类型&#xff0c;将数据处理为对应的类型入库&#xff0c;而定制版本会考虑局部列的数据类型&#xff0c;。举个…

Linux i2c工具——i2c_tools

1 简介 i2c-tools是一个用于处理I2C&#xff08;Inter-Integrated Circuit&#xff09;总线的工具集&#xff0c;它在Linux环境中广泛使用。这个工具集包含了一系列命令行工具&#xff0c;用于在I2C总线上执行各种操作&#xff0c;例如扫描设备、读取/写入寄存器、检测设备等。…

Copilot for Microsoft 365 扩充新增 16 种语言

最近&#xff0c;微软公司发布公告&#xff0c;进一步扩大 Copilot for Microsoft 365 语言支持&#xff0c;新增 16 种&#xff0c;支持的语言总数达到 25 种。 新支持的语言如下&#xff1a; 阿拉伯语 捷克语 丹麦语 荷兰语 芬兰语 希伯来语 匈牙利语 韩语 挪威语&am…

LLama3大模型本地部署 仅需6步完成对话模型本地安装部署。附赠ui配置、第三方微调模型、中文模型下载地址

本篇分为三部分 一&#xff1a;6步完成llama3大模型本地部署 二&#xff1a;8步完成llama3可视化对话界面安装 三&#xff1a;微调模型、中文模型下载资源分享 一、LLama3 大模型本地部署安装 首先去mata官网下载ollama客户端 Ollama 选择合适的操作系统平台后点击dowload按钮…

车规级低功耗汽车用晶振SG-9101CGA

车规级晶振SG-9101CGA属于爱普生9101系列&#xff0c;是一款可编程晶振。SG-9101CGA车规级晶振采用2.5x2.0mm封装&#xff0c;利用PLL技术生产&#xff0c;此款振荡器的频率范围从0.67M~170MHZ任一频点可选&#xff0c;步进1ppm&#xff0c;采用标准CMOS输出&#xff0c;最大输…

你知道C++多少——默认成员函数

&#x1f308;个人主页&#xff1a;小新_- &#x1f388;个人座右铭&#xff1a;“成功者不是从不失败的人&#xff0c;而是从不放弃的人&#xff01;”&#x1f388; &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f3c6;所属专栏&#xff1…

临时邮箱API发送邮件的安全性?如何保障?

临时邮箱API发送邮件的步骤有哪些&#xff1f;设置邮箱API方法&#xff1f; 电子邮件作为一种重要的通信方式&#xff0c;而临时邮箱API作为一种新兴的邮件发送技术&#xff0c;其安全性更是成为大家关注的焦点。那么&#xff0c;临时邮箱API发送邮件的安全性究竟如何呢&#…

本地vite启动的vue项目使用nginx代理

前提&#xff1a; 必须在同一网段或者相同的局域网&#xff01;&#xff01;&#xff01; nginx下载通道&#xff1a; https://nginx.org/en/download.html 步骤&#xff1a; 1、最好下载稳定版本&#xff1a; 2、下载后直接解压&#xff08;注意&#xff1a;解压后不要放…

【代码随想录37期】 第一周总结

周末再写一遍 【代码随想录37期】Day01 二分查找 移除元素 【代码随想录37期】Day02 有序数组的平方、长度最小的子数组、螺旋矩阵Ⅱ 【代码随想录37期】Day03 移除链表元素、设计链表、反转链表 【代码随想录37期】Day04 两两交换链表中的节点、删除链表的倒数第N个节点、链…

Baidu Comate智能编码助手:AI编程时代提升效率的好帮手

目录 写在前面一、如何安装二、如何使用场景需求体验步骤 三、AI 编程实战指令功能插件功能知识库功能 四、问题建议五、体验总结&#x1f680;写在最后 写在前面 Baidu Comate 是基于文心大模型的 AI编程工具&#xff0c;它结合百度积累多年的编程现场大数据和外部优秀开源数据…

JavaWeb文件上传/下载(Servlet)

效果 文件下载 文件上传 项目概述 Jakarta EE9&#xff0c;Web项目 项目文件结构 0 maven依赖&#xff0c;资源文件 <!-- lombok插件--> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId&g…

proteus示波器不弹出来

运行后示波器没有弹出来 点击调试&#xff08;Debug&#xff09;在点击Digital Oscilloscope 完成

[OpenGL高级光照] 阴影改善

目录 一 阴影失真 二 阴影改善 2.1 减小片段深度值 2.2 降低纹理 2.3 注意事项 三 消除Repeat的问题 3.1 让裁剪矩阵的立方体变大 ​3.2 利用采样范围重置 四 精度问题 本章节源码 点击此处 一 阴影失真 在上一篇中,实现了阴影效果之后,但是我们会发现阴影效果中地面…

Linux基础之进程的基本概念

目录 一、进程的基本概念 1.1 什么是进程 1.2 PCB的概念 1.3 进程的查看 1.3.1 查看进程方式一 1.3.2 查看进程的方式二 1.4 父进程与子进程 一、进程的基本概念 1.1 什么是进程 进程是什么&#xff1f; 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的…

GENRE

1、整体设计 该工作&#xff08;GENRE&#xff09;在新闻推荐的场景下&#xff0c;用 LLM 构造了三个不同的prompts&#xff0c;分别来进行新闻摘要的改写&#xff0c;用户画像的构建&#xff0c;还有样本增强。 2、分模块介绍 摘要改写&#xff1a;把新闻的title&#xff0c;…