faster jackson 注解扩展实现动态JsonIgnore
了解了 Faster Jackson 的基本用法后,我们了解到它作为 Spring Boot 默认的对象转换器的核心类,在日常开发中发挥着重要作用。在对象转化为 JSON 字符串时,我们经常利用 Faster Jackson 提供的trix 源码注解来控制转换细节。其中,@JsonIgnore注解尤为常用,用于忽略特定字段的序列化过程。然而,有时在某些场景下,我们需要实现类似 @JsonIgnore 的效果,但要求能够动态调整字段的序列化状态。
站在巨人的肩膀上,遵循开闭原则,我决定对 Faster Jackson 进行注解扩展,以实现动态控制字段的序列化。经过仔细阅读源码并进行调试,终于找到了实现思路。
首先,我自定义了一个注解 @AuthProtected,并在 Java 实体类中使用它来标记需要被序列化的青岛到大连源码字段。同时,引入了一个字段别名(mapper),用于后续依据此别名来判断字段是否进行序列化。此外,通过 RBACThreadLocalHandler 的 get() 方法,动态获取当前线程中允许序列化的字段集合,此集合在特定条件下通过一系列判断动态生成并保存在 threadlocal 中。
接下来,编写测试代码来验证功能实现。自定义注解后,我们通过实例化实体类并调用 Faster Jackson 的序列化方法,观察输出结果,验证动态控制字段序列化的能力。
通过上述实现,我们成功实现了运行时动态决定某个 bean 的字段是否能被序列化。这一方案不仅避免了重复造轮子的麻烦,也符合代码的可扩展性原则,为项目提供了更灵活、动态的 JSON 转换控制能力。
、Spring Boot返回Json数据及数据封装
在项目开发中,99拼购源码接口与接口之间,前后端之间数据的传输都使用 Json 格式。Spring Boot 中,接口返回 Json 格式的数据很简单,在 Controller 中使用 @RestController 注解即可返回 Json 格式的数据。@RestController 注解包含了原来的 @Controller 和 @ResponseBody 注解。默认情况下,使用 @RestController 注解即可将返回的数据结构转换成 Json 格式。Spring Boot 中默认使用的 Json 解析技术框架是 jackson。使用 @RestController 注解可以方便地返回 Json 数据。
Spring Boot 中对依赖都做了很好的封装。我们可以查看 pom.xml 中的 spring-boot-starter-web 依赖,可以看到一个 spring-boot-starter-json 依赖。Spring Boot 的特点之一是不需要人为去引入很多相关的依赖。我们可以再次点进去上面这个 spring-boot-starter-json 依赖,查看其内容。Spring Boot 中默认使用的 json 解析框架是 jackson。
在实际项目中,常用的数据结构无非有类对象、List 对象、Map 对象。溯源码标签材质默认的 jackson 框架对这三个常用的数据结构转成 json 后的格式如何?我们可以通过测试来验证。在 Controller 类中,我们可以分别返回 User 对象、List 和 Map。然后在浏览器中输入不同的 URL 来测试效果。我们看到,map 中不管是什么数据类型,都可以转成相应的 json 格式。这样就非常方便。
在实际项目中,我们难免会遇到一些 null 值出现。我们转 json 时,是不希望有这些 null 出现的。比如我们期望所有的 null 在转 json 时都变成 "" 这种空字符串。在 Spring Boot 中,我们可以通过配置来实现。我们可以新建一个 jackson 的配置类,修改返回 map 的接口,将几个值改成 null 进行测试。重启项目,再次输入 URL,pc直播网站源码可以看到 jackson 已经将所有 null 字段转成了空字符串了。
阿里巴巴的 FastJson 也常用于项目中 json 转换的相关工作。jackson 和 fastJson 的区别在于:上手难易程度、高级特性支持、官方文档、Example 支持和处理 json 速度。在扩展上,fastJson 没有 jackson 灵活,从速度或者上手难度来看,fastJson 可以考虑。在项目中使用的是阿里的 fastJson,挺方便的。使用 fastJson 需要导入依赖,版本为 1.2.。使用 fastJson 时,对 null 的处理和 jackson 有些不同。
为了在返回的 json 中添加一些其他信息,比如返回一些状态码 code 和返回一些 msg 给调用者,我们需要封装一个统一的 json 返回结构。这使得返回的 json 数据信息更加完整。我们定义了一个统一的 json 结构,包括数据、状态码、提示信息,并且可以根据实际业务需求做相应的添加。在 Controller 中,我们可以使用泛型来方便地返回各种数据类型。通过封装,我们不仅将数据通过 json 传给前端或者其他接口,还带上了状态码和提示信息。这在实际项目场景中应用非常广泛。
总结,本节详细分析了 Spring Boot 中 json 数据的返回。从默认的 jackson 框架到阿里巴巴的 fastJson 框架,我们对它们的配置进行了相应的讲解。另外,结合实际项目情况,我们总结了实际项目中使用的 json 封装结构体,加入了状态码和提示信息,使得返回的 json 数据信息更加完整。课程源代码下载地址:[课程源代码下载](链接)。
jackson学习之八:常用方法注解
在本文中,我们将深入探讨Jackson库中的一些常用方法注解,它们在序列化和反序列化过程中发挥关键作用。首先,JsonSetter注解用于在反序列化时,根据注解中的value属性,Jackson会查找JSON中的相应值来填充对象的属性。
JsonGetter注解则在序列化时发挥作用,它会将对象的属性转换为JSON字段名,以便在生成的JSON中表示。这种注解有助于保持数据的可读性和一致性。
JsonAnyGetter则提供了更大的灵活性,它允许将对象的任意属性转换为JSON字段,即使这些属性不是预先定义的。通过JsonAnyGetter,你可以动态地将对象的内部结构转化为JSON格式。
在实际应用中,通过合理使用这些注解,你可以优化JSON数据的生成和解析过程,提高代码的可维护性和性能。如果你在Jackson的学习和使用中遇到问题,或者想要了解更多关于这些注解的使用示例,可以访问我的GitHub,那里有我所有原创文章的分类汇总和配套源码,涵盖Java、Docker、Kubernetes、DevOps等多个领域。
如果你想深入了解或者交流Java世界的知识,欢迎关注我的公众号「程序员欣宸」,在微信搜索后,我将与你共同探索Java技术的无限可能。让我们一起在编程的道路上携手前行!
求shop++的源代码
主要库
spring-aop-4.0.9.RELEASE
spring-beans-4.0.9.RELEASE
spring-context-4.0.9.RELEASE
spring-context-support-4.0.9.RELEASE
spring-core-4.0.9.RELEASE
spring-expression-4.0.9.RELEASE
spring-jdbc-4.0.9.RELEASE
spring-orm-4.0.9.RELEASE
spring-test-4.0.9.RELEASE
spring-tx-4.0.9.RELEASE
spring-web-4.0.9.RELEASE
spring-webmvc-4.0.9.RELEASE
hibernate-core-4.3.9.Final
hibernate-jpa-2.1-api-1.0.0.Final
hibernate-entitymanager-4.3.9.Final
hibernate-validator-5.1.3.Final
hibernate-search-orm-4.5.3.Final
lucene-core-3.6.2
freemarker-2.3.
ehcache-core-2.6.
ehcache-web-2.0.4
shiro-core-1.2.3
shiro-web-1.2.3
c3p0-0.9.2.1
commons-lang-2.6
commons-beanutils-1.9.2
commons-collections-3.2.1
commons-io-2.4
commons-net-3.3
commons-fileupload-1.3.1
commons-codec-1.
commons-email-1.3.3
commons-compress-1.9
junit-4.
httpclient-4.3.5
httpcore-4.3.2
slf4j-api-1.7.7
jcl-over-slf4j-1.7.7
logback-core-1.1.2
logback-classic-1.1.2
dom4j-1.6.1
jackson-core-2.4.3
jackson-databind-2.4.3
jackson-annotations-2.4.3
IKAnalyzer_u6
Java泛型 | Jackson TypeReference获取泛型类型信息
前言
Jackson 是一个流行的 Json 序列化和反序列化框架,本文将探讨如何利用 TypeReference 实现涉及泛型的反序列化,并深入解析 TypeReference 的实现原理。对于需要获取泛型类型信息的场景,TypeReference 提供了一个通用的解决方案。
实例
Jackson 的 ObjectMapper 可以将 Json 字符串反序列化为 Java 对象。例如,以下代码将 Json 字符串反序列化为 List 类型:
Json 字符串:
json
[{ "id":null,"name":" ","age":,"gender":false,"email":"email","employed":true,"salary":}]
UserResource 实体类:
java
public class UserResource {
private Integer id;
private String name;
private Integer age;
private boolean gender;
private String email;
private boolean employed;
private double salary;
}
理想的实现方式
理想的实现方式是明确告诉 ObjectMapper 的 readValue 方法,我们需要的是 List 类型,以便将其反序列化为指定类型。然而,Java 编译器会报错,指出无法从参数化类型中选择,这是由于 Java 编译器将 List 视为 Class 类型,而非具体类型。
换一种方式实现
既然直接使用 List.class 不可行,我们尝试通过告诉 ObjectMapper,我们想要的是 List 类型,但返回值类型为 List,会怎样呢?结果是,虽然编译没有错误,但会出现警告:`Unchecked assignment: 'java.util.List' to 'java.util.List'`。ObjectMapper 实际上无法将序列化结果反序列化为 UserResource 类型,而是将其反序列化为 LinkedHashMap 类型。
TypeReference 的实现方式
为解决上述问题,Jackson 提供了 ObjectMapper 的 readValue 方法,接受一个 TypeReference 类型的实例作为第二个参数。通过创建 TypeReference 的子类实例,如 `new TypeReference<List>() { }`,可以获取完整的泛型类型信息,并将 Json 字符串反序列化为指定泛型类型。
TypeReference 实现原理
TypeReference 的核心在于通过继承自 Class 类的 getGenericSuperclass 方法,获取父类中的参数化类型(ParameterizedType)。此方法返回一个 Type 类型的对象,该对象准确反映了源代码中使用的实际类型参数。
Class 的 genericInfo 属性
在获取到 ParameterizedType 后,通过调用 getActualTypeArguments 方法,可以获得泛型参数的实际类型。这样,即使在编译时无法显式指定类型参数,通过 TypeReference 也可以在运行时获取和使用泛型信息。
总结
2024-11-20 15:04
2024-11-20 14:53
2024-11-20 14:39
2024-11-20 13:05
2024-11-20 12:41