Java 中FastJson的使用【吃透FastJson】

news2024/11/23 3:11:02

如果不了解JSON格式,建议先看下:JSON数据格式【学习记录】

JSON序列化、反序列化JavaBean的框架有很多,最常见的Jackson、阿里巴巴开源的FastJson、谷歌的GSON、apache提供的json-lib等,下面我们主要来熟悉一下:Java语言中FastJson的使用。

FastJson

FastJson是由阿里巴巴工程师基于Java开发的一款Json解析器和生成器,可用于将Java对象转换为其JSON表示形式,它还可以用于将JSON字符串转换为等效的Java对象。FastJson可以处理任意Java对象,包括没有源代码的预先存在的对象。

FastJson使用十分简便,我们只需要在Maven工程的pom文件中引入以下依赖即可:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>

FastJson API的入口是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。

API测试

我们已经在项目中引入了FastJson的依赖,我们再创建一个用户类用于测试:

package com.test.json;

@Data
public class User {
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
}

一、序列化

序列化就是将JavaBean序列化为JSON字符串,下面我们来看下FastJson常见的序列化方法。

下面序列化相关方法都有统一的返回值类型String。

1)toJsonString(Object o);

public static void main(String[] args) {
	User user = User.builder().id(1).name("张三").sex("男").age(23).build();
	System.out.println(JSON.toJSONString(user));
}
{"age":23,"id":1,"name":"张三","sex":"男"}

我们通过传入一个对象,便可以将对象转成JSON字符串,这里我们传入的不仅仅是JavaBean还可以是一个Map对象,传入Map对象我们同样也可以取到一个JSON字符串。

public static void main(String[] args) {
	Map<String, Object> userMap = new HashMap<>();
	userMap.put("id", 1);
	userMap.put("name", "张三");
	userMap.put("sex", "男");
	userMap.put("age", 23);
	System.out.println(JSON.toJSONString(userMap));
}
{"age":23,"id":1,"name":"张三","sex":"男"}

List对象也很适用,结果是一个标准的JSONArray的字符串。

public static void main(String[] args) {
	User zhangsan = User.build().id(1).name("张三").sex("男").age(23).build();
	User lisi = User.build().id(2).name("李四").sex("女").age(18).build();
	List<User> userList = new ArrayList<>();
	userList.add(zhangsan);
	userList.add(lisi);
	System.out.println(JSON.toJSONString(userList));
}
[{"id":1,"name":"张三","sex":"男","age":23},{"id":2,"name":"李四","sex":"女","age":18},]

2)toJSONString(Object o, boolean prettyFormat);

如果说 toJSONString(Object o); 的输出结果只有单调的一行让你看起来有点吃力,那么我们可以使用 toJSONString(Object o, boolean prettyFormat); 来让输出结果看起来舒服点。

public static void main(String[] args) {
	User user = User.builder().id(1).name("张三").sex("男").age(23).build();
	System.out.println(JSON.toJSONString(user, true));
}
{
    "age":23,
    "id":1,
    "name":"张三",
    "sex":"男"
}

通过JSON自带的格式化,让输出结果看起来更加清晰,真是贴心~

3)JSON.toJSONString(Object object, SerializerFeature… features);

我们可以看到这个方法里面有个参数SerializerFeature...,可能感到有点陌生,我们先来看下什么是 SerializerFeature ,通过源码可以发现 SerializerFeature 原来是个枚举类:

在这里插入图片描述

源码中都被 @deprecated 注释的实例说明已经废弃了,那有哪些是我们平时经常用到的呢:

对象描述
SerializerFeature.UseSingleQuotes使用单引号而不是双引号,默认为false
SerializerFeature.PrettyFormat结果是否格式化,默认为false
SerializerFeature.WriteDateUseDateFormat如果时间是date、时间戳类型,按照这种格式"yyyy-MM-dd HH:mm"初始化时间
SerializerFeature.WriteMapNullValue是否输出值为null的字段,默认为false
SerializerFeature.WriteClassName序列化时写入类型信息,默认为false

使用案例:

  • SerializerFeature.UseSingleQuotes

使用单引号而不是使用双引号,默认为false。

public static void main(String[] args) {
	User user = User.builder().id(1).name("张三").sex("男").age(23).build();
	System.out.println(JSON.toJSONString(user, SerializerFeature.UseSingleQuotes));
}
{'age':23,'id':1,'name':'张三','sex':'男'}
  • SerializerFeature.PrettyFormat

结果是否格式化,默认为false。

public static void main(String[] args) {
	User user = User.builder().id(1).name("张三").sex("男").age(23).build();
	System.out.println(JSON.toJSONString(user));
	System.out.println("===============");
	System.out.println(JSON.toJSONString(user, SerializerFeature.PrettyFormat));
}
{"age":23,"id":1,"name":"张三","sex":"男"}
===============
{
    "age":23,
    "id":1,
    "name":"张三",
    "sex":"男"
}
  • SerializerFeature.WriteDateUseDateFormat

如果时间是Date、时间戳类型,按照这种格式初始化时间"yyyy-MM-dd HH:mm"。

public static void main(String[] args) {
	System.out.println(JSON.toJSONString(new Date()));
	System.out.println("===============");
	System.out.println(JSON.toJSONString(new Date(), SerializerFeature.WriteDateUseDateFormat));
}
1676427576691
===============
"2023-02-15 10:19:37"

通过这种方式我们将日期输出成了固定的格式:yyyy-MM-dd HH:mm,有时候我们不想得到这种格式那该怎么办?通过下面方法支持自定义时间格式:(注意方法不要用错)

4)toJSONStringWithDateFormat(Object object, String dateFormat, SerializerFeature… features);

public static void main(String[] args) {
	System.out.println(JSON.toJSONString(new Date()));
	System.out.println("===============");
	System.out.println(JSON.toJSONStringWithDateFormat(new Date(), "HH:mm:ss"));
}
1676428350771
===============
"10:32:30"

下面我们接着看SerializerFeature枚举类的其他用法。

  • SerializerFeature.WriteMapNullValue

是否输出值为null的字段,默认为false。

这个有什么用处呢?我们应该很清楚开发规范中鼓励用JavaBean传递参数,尽量减少Map传递参数,因为Map相当于一个黑盒,对于使用者来说根本不知道里面存在哪些字段,而对于创建者来说估计也时常会忘记里面存在哪些字段,为了解决这个痛,JSON也推出了解决方法:

public static void main(String[] args) {
	Map<String, Object> dataMap = new HashMap<>();
	dataMap.put("name", null);
	dataMap.put("age", 23);
	System.out.println(JSON.toJSONString(dataMap));
	System.out.println("===============");
	System.out.println(JSON.toJSONString(dataMap, SerializerFeature.WriteMapNullValue));
}
{"age":23}
===============
{"name":null,"age":23}

通过普通方式的 toJSONString() 方法,空值仿佛被吃掉了,这很可能会成为一个开发灾难!

  • SerializerFeature.WriteClassName

序列化时写入类信息,默认为false。这个方法可以在反序列化的时候用到,用法如下:

public static void main(String[] args) {
	User user = User.builder().id(1).name("张三").sex("男").age(23).build();
	System.out.println(JSON.toJSONString(user, SerializerFeature.WriteClssName));
}
{"@type":"com.test.json.User","age":23,"id":1,"name":"张三","sex":"男"}

通过这样我们可以看到我们序列化的对象是什么类型的。

上面这些便是toJSONString的扩展用法,上面说到的是序列化,那么对应的便是反序列化。

二、反序列化

反序列化就是把JSON格式的字符串转换为JavaBean对象。

1)JSONObject parseObject(String text);

public static void main(String[] args){
	String jsonStr = "{'age':23,'id':1,'name':'张三','sex':'男'}";
	JSONObject jsonObject = JSON.parseObject(jsonStr);
	System.out.println(jsonObject.get("name"));
}
张三

用法十分简单,可以将一个标准的JSON字符串转为一个JSONObject对象,由于JSONObject类实现了Map接口,因此我们可以通过get()来获取到值。

我们上述已经说过Map的致命不足,所以我们更希望能得到一个JavaBean对象。

2)<T> T parseObject(String text, Class<T> clazz);

我们通过传入我们想要转换的对象类型,就可以得到我们想要的JavaBean。

public static void main(String[] args){
   String jsonStr = "{'age':23,'id':1,'name':'张三','sex':'男'}";
    User user = JSON.parseObject(jsonStr, User.class);
    System.out.println(user.getName());
}
张三

//后续待更新…

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

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

相关文章

时隔多年,这次我终于把动态代理的源码翻了个地儿朝天

本文内容整理自 博学谷狂野架构师 动态代理简介 ​ Proxy模式是常用的设计模式&#xff0c;其特征是代理类与委托类有同样的接口&#xff0c;代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类&#xff0c;以及事后处理消息等。 用户可以更加结构图&#xff0…

软件项目进度安排与跟踪:关键路径的计算

在一个软件项目中&#xff0c;管理人员需要按时了解项目进度&#xff0c;制定项目计划&#xff0c;同时需要及时发现所遇到的问题&#xff0c;然后和团队成员制定解决方案&#xff0c;确保整个计划可以顺利的进行&#xff0c;因此项目进度安排与跟踪是项目管理中的一个重要环节…

SpringBoot 整合 Nacos 实现注册中心和配置中心

SpringBoot 整合 Nacos 引入 Maven 依赖 首先&#xff0c;我们还是要引入 Maven 依赖&#x1f447; <!--注册中心的依赖--> <dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-discovery-spring-boot-starter</artifactI…

雷达气象学和卫星气象学期末复习笔记

雷达气象学期末复习 气象雷达和雷达气象 气象雷达&#xff1a;用于气象探测的雷达&#xff0c;气象目标主要是云和降水粒子 雷达气象&#xff1a;利用气象雷达研究气象中的局地降水和局地降水系统&#xff0c;为降水系统的探测和临近预报服务 雷达的分类 天气雷达&#xff1a;…

CTF-取证题目解析-提供环境

一、安装 官网下载&#xff1a;Volatility 2.6 Release 1、将windows下载的volatility上传到 kali/home 文件夹里面 3、将home/kali/vol刚刚上传的 移动到use/sbin目录里面 mv volatility usr/local/sbin/ 切换到里面 cd /usr/local/sbin/volatility 输入配置环境echo $PAT…

SpringBoot依赖原理分析及配置文件

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 SpringBoot依赖原理分析及配置文件 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1f4c4…

电脑文件被误删?360文件恢复工具,免费的文件恢复软件

电脑里面保存着各种文件&#xff0c;因为误操作我们把还需要用的文件给删除了。很多人都想要使用不收费的文件恢复软件来进行恢复操作&#xff0c;但是又不清楚有哪些文件可以帮到我们。接下来就给大家介绍&#xff0c;一款真正免费的数据 恢复app&#xff0c;一起来看看&#…

eSGD(edge SGD) 边缘设备进行分布式机器学习的参数聚合策略实现高效通信 论文精读

说明 这篇论文比较短&#xff0c;但是提出的方法确很不错。联邦学习或者分布式机器学习中减少通信开销一般有两种方法&#xff1a; 减少发送的数据量&#xff1b;通过改变通信的拓扑结构&#xff1b; 本文通过选取重要的梯度进行更新而减少通信的开销&#xff0c;属于第一种…

招聘链接怎么做_分享招聘小程序制作步骤

招聘小程序的主要用户就是企业招聘端和找工作人员的用户端,下面从这两个端来对招聘小程序开发的功能进行介绍。 企业端功能 1、岗位发布:企业根据自身岗位需求,在招聘app上发布招聘岗位及所需技能。 2.简历筛选:根据求职者提交的简历选择合适的简历,并对公开发布的简历进行筛…

主数据管理平台如何进行模型管理

企业管理主数据&#xff0c;模型管理尤为重要。在对主数据进行建模操作时&#xff0c;既要保证数据通用性、安全性&#xff0c;又要符合企业的业务需求。今天小亿带你认识一下亿信华辰睿码主数据管理平台里的主数据模型管理。 主数据模型分类 一款专业的主数据管理平台&#…

【RabbitMQ笔记01】Windows搭建RabbitMQ消息队列基础运行环境

这篇文章&#xff0c;主要介绍如何在Windows系统中&#xff0c;搭建RabbitMQ消息队列的运行环境。 目录 一、RabbitMQ消息队列 1.1、什么是RabbitMQ 1.2、安装Erlang &#xff08;1&#xff09;下载安装包 &#xff08;2&#xff09;配置环境变量 &#xff08;3&#xff…

C++STL剖析(七)—— map和multimap的概念和使用

文章目录1. map的介绍和使用&#x1f351; map的模板参数列表&#x1f351; map的构造&#x1f351; map的使用&#x1f345; insert&#x1f345; operator[ ]&#x1f345; find&#x1f345; erase&#x1f345; swap&#x1f345; empty&#x1f345; size&#x1f345; co…

共享—1658页《Java面试突击核心手册》几乎覆盖市面上所有面试考点

说快也快&#xff0c;说不快也不慢&#xff01; 年前&#xff0c;陆陆续续&#xff0c;好多大厂都在裁员&#xff1b; 年后&#xff0c;又有一大批程序员失业&#xff0c;找不到避风港&#xff1b; 这时候&#xff0c;就有人说了&#xff0c;为什么找工作这么难&#xff1f;…

堆排序的概念

文章目录一、堆&#xff08;Heap&#xff09;的基本概念1.1 引入二叉树的顺序存储二、建立大根堆三、基于大根堆进行排序选择排序&#xff1a;在每一趟待排元素中选取关键字最小&#xff08;或最大&#xff09;的元素加入有序子序列选择排序分为&#xff1a; 简单选择排序堆排…

springboot+mybatis连接数据库实现增删改查功能

springbootmybatis连接数据库实现增删改查功能创建表创建项目实体类DAO接口写sql的XML文件Service层Controller启动类结果目录结构参考博客创建表 create table user(id int ,name varchar(30),pwd varchar(40) )insert into user values(2,hxf,789101),(3,hlm,789102),(4,hzh…

【ArcGIS自定义脚本工具】批量对栅格执行栅格计算器

文章目录一、功能介绍二、脚本代码三、工具参数四、用例4.1 批量单位换算4.2 批量计算植被覆盖度4.3 批量填充空值系列文章目录&#xff1a; ArcGIS自定义脚本工具一、功能介绍 功能 将多个栅格文件按照某以代数表达式执行栅格计算器(Raster Calculator) 工具&#xff0c;并将输…

linux内核内存笔记

一、linux用户态内核态内存结构 对于32位的linux操作系统&#xff0c;系统为每个进程分配0~4G的内存空间&#xff0c;而64位系统则更大&#xff1a; linux内存空间地址范围 可见Linux的内存分配规则&#xff1a; 二、总体分配规则 1、用户态在低地址&#xff0c;内核态在高地址…

进击中的 Zebec 生态,Web2 与 Web3 世界的连接器

虽然从意识形态上看&#xff0c;Web2世界与Web3世界存在着不同的逻辑&#xff0c;但我们同样看到&#xff0c;随着加密资产领域的发展&#xff0c;其正在作为优质投资品&#xff0c;被以Paypal、高盛等主流机构重视与接受。当然&#xff0c;除了作为投资者品外&#xff0c;近年…

C++学习笔记-环境设置

C 是一种通用编程语言&#xff0c;如今已广泛用于竞争性编程。它具有命令式&#xff0c;面向对象和通用编程功能。 C 在Windows&#xff0c;Linux&#xff0c;Unix&#xff0c;Mac等许多平台上运行。在开始使用C 进行编程之前。我们将需要在本地计算机上设置一个环境&#xff0…

用PHP实现CSPRepor报告预警信息存储和动态显示。

一、了解CSP内容安全策略 CSP 的实质就是白名单制度&#xff0c;开发者明确告诉客户端&#xff0c;哪些外部资源可以加载和执行&#xff0c;等同于提供白名单。它的实现和执行全部由浏览器完成&#xff0c;开发者只需提供配置。 作用就是&#xff1a;大大增强了网页的安全性。…