使用Jackson转JSON时自定义转换规则

使用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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值