002、Spring Boot返回Json数据及数据封装
在项目开发中,接口与接口之间,前后端之间数据的传输都使用 Json 格式。Spring Boot 中,各种源码如何运行接口返回 Json 格式的数据很简单,在 Controller 中使用 @RestController 注解即可返回 Json 格式的数据。@RestController 注解包含了原来的 @Controller 和 @ResponseBody 注解。默认情况下,使用 @RestController 注解即可将返回的数据结构转换成 Json 格式。Spring Boot 中默认使用的 Json 解析技术框架是 jackson。使用 @RestController 注解可以方便地返回 Json 数据。
Spring Boot 中对依赖都做了很好的封装。我们可以查看 pom.xml 中的qpc源码分析 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 进行测试。ehr源码php重启项目,再次输入 URL,可以看到 jackson 已经将所有 null 字段转成了空字符串了。
阿里巴巴的 FastJson 也常用于项目中 json 转换的相关工作。jackson 和 fastJson 的区别在于:上手难易程度、高级特性支持、官方文档、Example 支持和处理 json 速度。在扩展上,fastJson 没有 jackson 灵活,从速度或者上手难度来看,fastJson 可以考虑。在项目中使用的是阿里的 fastJson,挺方便的unity源码街机。使用 fastJson 需要导入依赖,版本为 1.2.。使用 fastJson 时,对 null 的处理和 jackson 有些不同。
为了在返回的 json 中添加一些其他信息,比如返回一些状态码 code 和返回一些 msg 给调用者,我们需要封装一个统一的 json 返回结构。这使得返回的 json 数据信息更加完整。我们定义了一个统一的 json 结构,包括数据、状态码、提示信息,并且可以根据实际业务需求做相应的添加。在 Controller 中,我们可以使用泛型来方便地返回各种数据类型。通过封装,我们不仅将数据通过 json 传给前端或者其他接口,还带上了状态码和提示信息。这在实际项目场景中应用非常广泛。
总结,本节详细分析了 Spring Boot 中 json 数据的返回。从默认的 jackson 框架到阿里巴巴的 fastJson 框架,我们对它们的配置进行了相应的讲解。另外,结合实际项目情况,我们总结了实际项目中使用的 json 封装结构体,加入了状态码和提示信息,使得返回的 json 数据信息更加完整。课程源代码下载地址:[课程源代码下载](链接)。
faster jackson 注解扩展实现动态JsonIgnore
了解了 Faster Jackson 的基本用法后,我们了解到它作为 Spring Boot 默认的对象转换器的核心类,在日常开发中发挥着重要作用。在对象转化为 JSON 字符串时,我们经常利用 Faster Jackson 提供的注解来控制转换细节。其中,@JsonIgnore注解尤为常用,用于忽略特定字段的序列化过程。然而,有时在某些场景下,我们需要实现类似 @JsonIgnore 的效果,但要求能够动态调整字段的序列化状态。
站在巨人的肩膀上,遵循开闭原则,我决定对 Faster Jackson 进行注解扩展,以实现动态控制字段的序列化。经过仔细阅读源码并进行调试,终于找到了实现思路。
首先,我自定义了一个注解 @AuthProtected,并在 Java 实体类中使用它来标记需要被序列化的字段。同时,引入了一个字段别名(mapper),用于后续依据此别名来判断字段是否进行序列化。此外,通过 RBACThreadLocalHandler 的 get() 方法,动态获取当前线程中允许序列化的字段集合,此集合在特定条件下通过一系列判断动态生成并保存在 threadlocal 中。
接下来,编写测试代码来验证功能实现。自定义注解后,我们通过实例化实体类并调用 Faster Jackson 的序列化方法,观察输出结果,验证动态控制字段序列化的能力。
通过上述实现,我们成功实现了运行时动态决定某个 bean 的字段是否能被序列化。这一方案不仅避免了重复造轮子的麻烦,也符合代码的可扩展性原则,为项目提供了更灵活、动态的 JSON 转换控制能力。
求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.
es、DevOps等多个领域。
如果你想深入了解或者交流Java世界的知识,欢迎关注我的公众号「程序员欣宸」,在微信搜索后,我将与你共同探索Java技术的无限可能。让我们一起在编程的道路上携手前行!
2024-11-20 18:09
2024-11-20 17:47
2024-11-20 17:20
2024-11-20 17:15
2024-11-20 17:08