spring boot 最佳实践(一)--使用jackson

本文介绍了常用的Java JSON解析工具,如FastJSON、GSON和Jackson,并详细讲解了如何在Spring Boot项目中配置和使用Jackson,包括枚举类型的支持、自定义配置及JDK8时间类型的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前java json解析工具有阿里的fastjson,google的GSON,以及SpringMVC 默认的解析工具Jackson。

Maven引入jar包

spring-boot-starter-web默认引入了以下依赖:

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.0</version>
</dependency>
<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.7</version>
</dependency>
<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.7</version>
</dependency>

Jackson从2.0开始改用新的包名fasterxml;1.x版本的包名是codehaus。

基础用法

1. 初始化

在spring boot项目里建议全局初始化ObjectMapper

@Configuration
public class AppConfig{
  @Bean
  public ObjectMapper ObjectMapper(){
   ObjectMapper objectMapper=new ObjectMapper();
   return objectMapper;
  }
}

2. 基本用法

//将json字符串转换成对象
Map map = objectMapper.readValue(jsonString, Map.class);
//转换对象类型
SomethingPOJO pojo = objectMapper.convertValue(map, SomethingPOJO.class);
//将对象转换成json字符串
Sting string = objectMapper.writeValueAsString(pojo);
//将json字符串转换成List
JavaType javaType = mapper.getTypeFactory()
.constructParametricType(List.class, Person.class);
List<Person> jsonToPersonList = objectMapper.readValue(arrayToJson, mapType);

3. 枚举

public enum TypeEnumWithValue {
	TYPE1(1, “Type A”), TYPE2(2, “Type 2);
	private Integer id;
	private String name;
	
	/** 
	* @JsonValue只能标识在类的唯一个方法上,表示序列化时使用当前方法转换本对象。
	*/
	@JsonValue
	public String getName() {
		return name;
	}

   /**
   * @JsonCreator标识在一个静态方法上,表示反序列化时使用当前方法初始化本对象。
   */
    @JsonCreator
    public static TypeEnumWithValue  create(String val) {
        TypeEnumWithValue [] units = TypeEnumWithValue.values();
        for (TypeEnumWithValue  unit : units) {
            if (unit.getName().equals(val)) {
                return unit;
            }
        }
        throw new IllegalArgumentException();
       }
    }

4. 配置ObjectMapper

ObjectMapper objectMapper=new ObjectMapper();
// 忽略json字符串中不识别的属性
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 忽略无法转换的对象 “No serializer found for class com.xxx.xxx”
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);

在JDK8项目中使用jackson

在JDK8项目中使用JDK8新特性的话,jackson需要新增依赖包。

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.8.6</version>
</dependency>

1. 注册Module


@Configuration
public class AppConfig{
  @Bean
  public ObjectMapper ObjectMapper(){
   ObjectMapper mapper = new ObjectMapper()
   .registerModule(new ParameterNamesModule())
   .registerModule(new Jdk8Module())
   .registerModule(new JavaTimeModule());
   return objectMapper;
  }
}

也可以使用自动注册的方式:

ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();

2. jdk8 time

jdk8使用了新的时间包,在时间对象上需要做的配置。

import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat
public class POJO{
	@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
	private LocalDateTime time;
	
	//getter,setter...
}

快捷配置

在springboo1.1以上的版本默认配置了Jackson的ObjectMapper,不必自行定义bean。
可以这么做全局设置:

spring:
  jackson:
    serialization:
      WRITE_DATES_AS_TIMESTAMPS: false
    default-property-inclusion: non_null

更多配置参见 org.springframework.boot.autoconfigure.jackson.JacksonProperties

参考文档

  1. jackson JDK8: https://github.com/FasterXML/jackson-modules-java8
  2. Jackson JSON Tutorial: http://www.baeldung.com/jackson
  3. Springboot统一配置Jackson:https://www.cnblogs.com/woshimrf/p/springboot-jackson-global-config.html
  4. Spring Boot中Jackson应用详解: https://blog.51cto.com/7308310/2310930
<think>好的,用户现在问的是“spring-boot-starter-webflux包含jackson吗”。之前他们遇到了关于HttpMessageConverters找不到的问题,可能是在使用Spring Boot的Web模块时出现的依赖问题。现在他们转向WebFlux,可能是在尝试反应式编程,或者是项目需要非阻塞的框架。所以需要确定WebFlux的starter是否包含Jackson,这关系到他们的项目能否正常处理JSON数据。 首先,我需要回忆Spring Boot的依赖结构。记得spring-boot-starter-webflux是用于构建反应式Web应用的,而传统的spring-boot-starter-web是基于Servlet的。WebFlux默认可能也会包含Jackson,因为JSON处理在Web应用中很常见。但需要确认官方文档或依赖树。 然后,用户可能的问题背景是,他们可能在迁移项目到WebFlux,或者在新建项目时选择了WebFlux,想知道是否需要额外引入Jackson依赖。或者他们在使用WebFlux时遇到了JSON序列化的问题,怀疑是否缺少依赖。 另外,用户之前的问题是关于缺少HttpMessageConverters,而HttpMessageConverters在Web模块中自动配置,可能他们现在转向WebFlux,想知道相关的JSON配置是否自动包含,特别是是否包含Jackson。 需要确认spring-boot-starter-webflux的依赖是否传递性包含Jackson。查Spring Boot的官方文档,发现WebFlux的starter通常包含spring-boot-starter-json,而后者又包含Jackson。因此,默认情况下WebFlux是包含Jackson的。 但是,用户可能的情况是,他们是否排除了某些依赖,或者是否使用了其他JSON库比如Gson,导致Jackson没有被包含。或者他们可能误以为WebFlux不需要Jackson,所以需要明确说明默认情况。 此外,可能需要指出在WebFlux中,使用的是Jackson2JsonEncoder/Decoder,而不是HttpMessageConverters,但原理类似,都是处理JSON转换。所以如果用户的问题涉及到JSON转换,应该说明WebFlux默认支持Jackson,无需额外配置,除非需要自定义。 还需要提醒用户,如果确实需要排除Jackson,或者使用其他库,应该如何操作。例如,如何排除Jackson并引入Gson,但需要注意反应式编程中Gson的支持情况,可能不如Jackson好,或者需要额外配置。 总结回答的结构应该是:先直接回答问题,是的,WebFlux starter包含Jackson;然后解释为什么,因为它依赖spring-boot-starter-json;接着说明默认情况下的自动配置,以及如何验证;最后提到排除或替换Jackson的方法,以及可能需要注意的地方。这样用户可以得到全面的信息,解决当前疑问,并预防潜在的问题。</think>是的,**`spring-boot-starter-webflux` 默认包含 Jackson 依赖**。以下是详细说明: --- ### **1. 默认包含 Jackson 的原因** - `spring-boot-starter-webflux` 是 Spring Boot 为构建 **响应式(Reactive)Web 应用** 提供的 Starter,其核心依赖链中包含 `spring-boot-starter-json`。 - `spring-boot-starter-json` 进步引入了 **Jackson 核心库**(如 `jackson-databind`、`jackson-annotations` 等),用于实现 JSON 序列化与反序列化。 可以通过 Maven/Gradle 查看依赖树验证: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> ``` --- ### **2. 自动配置的 Jackson 行为** - **自动注册 JSON 转换器**:在 WebFlux 中,Spring Boot 会自动配置 `Jackson2JsonEncoder` 和 `Jackson2JsonDecoder`(用于处理响应式 HTTP 消息的 JSON 转换)。 - **无需手动配置**:只要项目中存在 Jackson 依赖,Spring Boot 会默认启用 JSON 处理能力,例如在 REST API 中直接返回对象即可被自动转换为 JSON。 --- ### **3. 如何验证是否包含 Jackson?** 检查项目的依赖树: - **Maven**: ```bash mvn dependency:tree | grep jackson ``` 输出示例: ``` [INFO] +- org.springframework.boot:spring-boot-starter-json:jar:2.7.5 [INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.13.4 [INFO] | +- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.13.4 [INFO] | +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.13.4 [INFO] | \- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.13.4 ``` - **Gradle**: ```bash gradle dependencies | grep jackson ``` --- ### **4. 需要排除 Jackson使用其他 JSON 库?** - **排除 Jackson**: 若需移除 Jackson(例如改用 Gson),需显式排除 `spring-boot-starter-json`: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </exclusion> </exclusions> </dependency> ``` - **使用 Gson**: 如果添加了 Gson 依赖,Spring Boot 会检测到并自动配置 `GsonHttpMessageConverter`,但需注意 **WebFlux 对 Gson 的支持可能不如 Jackson 完善**。 --- ### **5. 关键结论** - **默认包含 Jackson**:`spring-boot-starter-webflux` 通过 `spring-boot-starter-json` 间接引入了 Jackson,无需额外配置。 - **无需手动干预**:直接编写返回对象的控制器方法即可自动处理 JSON。 - **替换 JSON 库需谨慎**:建议优先使用 Jackson,除非有明确需求使用其他库。 如果有其他 JSON 库需求或配置问题,欢迎进步探讨! 🚀
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值