使用Jackson转JSON时自定义转换规则
导入相关依赖
<!-- spring-boot-starter-web 包含 spring-boot-starter-json 包含 jackson 相关依赖,所以只需要引 spring-boot-starter-web依赖就可以了。 因为 SpringBoot 已经整合好了,所以不用担心兼容性问题。-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 如果你需要的Jackson版本与 SpringBoot自带的不一致,也可以自己导入 Jackson 相关依赖。可以从maven中央仓库查询对应版本:https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
编写自定义配置类
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.io.IOException;
import java.text.SimpleDateFormat;
@Configuration
public class JacksonConfig {
@Bean
@Primary // 当有多个同类型的bean被注入到一个单一的bean中时,被@Primary标记的bean被默认选择
@ConditionalOnMissingBean(ObjectMapper.class) // 当前SpringBoot上下文中没有ObjectMapper的Bean才生效
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); // 转换时自定义时间格式
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(""); // 将 null 转换为 ""
}
});
return objectMapper;
}
}
@Primary 注解
@Primary 翻译过来是“主要的” 在Spring框架中经常使用。它被用来表示当有多个同类型的bean被注入到一个单一的bean中时,哪一个bean应该被优先考虑。
让我们通过一个简单的例子来理解这个概念:
假设你有两个实现了同一个接口的beans:
@Component
public class Cat implements Animal {
@Override
public String sound() {
return "Meow";
}
}
@Component
public class Dog implements Animal {
@Override
public String sound() {
return "Bark";
}
}
如果你在另一个bean中尝试注入Animal类型的对象,Spring将会迷茫,因为它不确定应该注入哪一个实现(Cat还是Dog)。
这时,@Primary注解就派上用场了。你可以将其添加到你希望优先被考虑的bean上:
@Component
@Primary
public class Cat implements Animal {
// ...
}
通过使用@Primary注解,当你尝试注入Animal时,Spring会默认选择Cat,因为它被标记为主要的。
但请注意,@Primary只适用于歧义的情况,即当有多个bean可以注入时。如果只有一个bean匹配所需的类型,那么Spring将会选择这个bean,无论它是否被标记为@Primary。
ObjectMapper的使用
// 将对象转换为JSON字符串
String jsonStr = objectMapper.writeValueAsString(object);