fastjson2 简单使用

2024-03-11 14:28
文章标签 简单 使用 fastjson2

本文主要是介绍fastjson2 简单使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考

https://alibaba.github.io/fastjson2/
https://alibaba.github.io/fastjson2/annotations_cn.html
https://alibaba.github.io/fastjson2/features_cn

基本操作

json 字符串转为 jsonObject:

String json = "{\"name\":\"tom\",\"age\":18}";
JSONObject data = JSON.parseObject(json);

json 字符串转为 jsonArray:

String json = "[{\"name\":\"Alice\",\"age\":25,\"city\":\"Exampleville\"},{\"name\":\"Bob\",\"age\":30," +"\"city\":\"Sampleburg\"},{\"name\":\"Charlie\",\"age\":28,\"city\":\"Testington\"}]";
final JSONArray jsonArray = JSON.parseArray(json);

json 字符串转为 java 对象:

String json = "{\"name\":\"tom\",\"age\":18}";
User user = JSON.parseObject(json, User.class);

java 对象转为 json 字符串:

final User user = new User();
user.setName("tom");
user.setAge(18);
final String jsonString = JSON.toJSONString(user);

操作 json:

String json = "{\"name\":\"JohnDoe\",\"age\":30,\"city\":\"NewYork\",\"isStudent\":false,\"grades\":[85,90," +"78,92],\"address\":{\"street\":\"123MainSt\",\"zipCode\":\"10001\"},\"contact\":{\"email\":\"john" +".doe@example.com\",\"phoneNumbers\":[\"555-1234\",\"555-5678\"]},\"balance\":1200.75}";
final JSONObject jsonObject = JSON.parseObject(json);
final String name = jsonObject.getString("name");
final Integer age = jsonObject.getInteger("age");
final JSONArray grades = jsonObject.getJSONArray("grades");
final JSONObject address = jsonObject.getJSONObject("address");
final String street = address.getString("street");
final Double balance = jsonObject.getDouble("balance");

fastjson2 中提供了 json 中对象和数组的对应表示,对象使用 JSONObject 表示,列表使用 JSONArray 表示,JSONObject、JSONArray 也都提供了相应的操作方法来实现获取值、添加值、更新值、删除值等操作(方法都很通俗易懂,get 开头就是获取值,set 开头的方法就是更新值,方法名和 remove 类似的就是删除操作,非常简单)。

高级操作

枚举类序列化时指定序列化使用的字段

第一种实现方法比较复杂,是使用自定义序列化器实现:

@Getter
public enum Season {SPRING("春天", "万物复苏"),SUMMER("夏天", "热"),AUTUMN("秋天", "秋高气爽"),WINTER("冬季", "冷");private final String description;private final String features;Season(String description, String features) {this.description = description;this.features = features;}}
@Data
public class Student {public String name;public Integer age;public Season favoriteSeason;
}
// enum 默认序列化成 json
final Student student = new Student();
student.setAge(18);
student.setName("tom");
student.setFavoriteSeason(Season.SUMMER);
System.out.println(JSON.toJSONString(student));// 使用序列化器指定枚举类序列化时使用的字段
final ObjectWriter<Season> seasonWriter = (jsonWriter, fieldValue, fieldName, type, l) -> {if (fieldValue instanceof Season) {jsonWriter.writeString(((Season) fieldValue).getDescription());} else {jsonWriter.writeAny(fieldValue);}
};final ObjectWriterProvider objectWriterProvider = new ObjectWriterProvider();
objectWriterProvider.register(Season.class, seasonWriter);
final JSONWriter.Context writeContext = JSONFactory.createWriteContext(objectWriterProvider);
final String jsonString = JSON.toJSONString(student, writeContext);
System.out.println(jsonString);

image.png
从结果中可以看到,enum 默认序列化时使用的是枚举常量,我们使用自定义序列化器指定序列化 Season 枚举类时使用它的 description 字段作为字段值。

还有更简单的方法,就是使用 @JSONField(value = true)注解设置枚举类要序列化时使用的字段,下面的 jsonField 注解的使用这个章节中讲了。

jsonField 注解的使用

@Data
public class Student {@JSONField(ordinal = 2)private Integer age;private Season favoriteSeason;@JSONField(ordinal = 1)private String name;@JSONField(format = "yyyyMMdd")private Date birthday;@JSONField(serialize = false)private String address;@JSONField(deserialize = false)private String favoriteFood;@JSONField(name = "GENDER")private Gender gender;
}

@JSONField(ordinal = 2)注解设置了字段在序列化为 json 后的排列顺序,越小排在越前。
@JSONField(format = "yyyyMMdd")注解设置了在序列化 Date 类型的 birthday 字段时使用的日期格式。
@JSONField(serialize = false)注解设置了 address 字段不会被序列化,也就是序列化的结果中不会包含 address 字段。
@JSONField(deserialize = false)注解设置了将 json 序列化成 student 对象时不会序列化 favoriteFood 字段,也就是 favoriteFood 字段会为 null
@JSONField(name = "GENDER")注解设置了 gender 字段序列化成 json 时的字段名为 GENDER。

如果类的字段是 public 并且有 get 和 set 方法,@JSONField(deserialize = false) 会失效。bean 类都尽量标准一点,属性都设置为 private,提供 get 和 set 方法,这样会减少异常的发生。

@Getter
public enum Season {SPRING("春天", "万物复苏"),SUMMER("夏天", "热"),AUTUMN("秋天", "秋高气爽"),WINTER("冬季", "冷");private final String description;@JSONField(value = true)private final String features;Season(String description, String features) {this.description = description;this.features = features;}
}

@JSONField(value = true)设置了 Season 枚举类序列化成 json 时会使用 features 字段做为其值,而不是默认使用的枚举常量。

jsonPath 从 json 字符串中读取字段值

String str = "{\"address\":\"翻斗大街翻斗花园二号楼1001室\",\"favoriteFood\":\"炸小肉丸\",\"name\":\"图图\",\"age\":3,\"id\":10}";JSONPath path = JSONPath.of("$.id");
JSONReader parser = JSONReader.of(str);
Integer result = (Integer) path.extract(parser);System.out.println(result);

上面的代码实现了从 json 字符串中读取 id 字段的值。

这篇关于fastjson2 简单使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/798053

相关文章

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P