SpringMVC 自定义序列化规则

文章目录


本文讲解如何如何自定义SpringMVC的序列化规则

使用SpringBoot为例,SpringBoot默认使用Jackson作为序列化工具。通过修改Jackson配置即可自定义序列化规则。

方法1

一般需要为第三方java类实现序列化规则使用,这里以boolean转int为例(true/false->1/0),代码如下

// 1 编写自定义序列化类,实现JsonSerializer接口
public class BooleanSerializer extends JsonSerializer<Boolean> {
    @Override
    public void serialize(Boolean value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (value != null && value) {
            gen.writeNumber(1);
        } else {
            gen.writeNumber(0);
        }
    }
}
// 2 测试
public class Test {
    @Test
    public void globalSerialize() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule simpleModule = new SimpleModule();
        BooleanSerializer serializer = new BooleanSerializer();
        simpleModule.addSerializer(Boolean.class,serializer);
        simpleModule.addSerializer(boolean.class,serializer);
        objectMapper.registerModule(simpleModule);
        // 输出 1
        System.out.println(objectMapper.writeValueAsString(true));
    }
}

在SpringBoot中只要将SimpleModule注册到容器中,容器会自动配置到Jackson上。全部配置代码如下,测试略

@Configuration
public class JacksonConfig {
    /**
     * 自定义boolean类型序列化规则
     */
    static class BooleanSerializer extends JsonSerializer<Boolean> {
        @Override
        public void serialize(Boolean value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            if (value != null && value) {
                gen.writeNumber(1);
            } else {
                gen.writeNumber(0);
            }
        }
    }
    @Bean
    public SimpleModule simpleModule() {
        SimpleModule module = new SimpleModule();
        BooleanSerializer serializer = new BooleanSerializer();
        module.addSerializer(Boolean.class, serializer);
        module.addSerializer(boolean.class, serializer);
        return module;
    }

}

方法2

自定义java类使用,以User类为例

@Data
public class User {
	private Integer id;
	private String name;
}
// 1 自定义序列化类实现JsonSerializer接口
public static class UserSerializer extends JsonSerializer<User> {
	// 假设序列化时,为每个字段增加u前缀
	@Override
	public void serialize(User value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
		gen.writeStartObject();
		gen.writeNumberField("uid", value.getId());
		gen.writeStringField("uname", value.getName());
		gen.writeEndObject();
	}
}
// 2 通过@JsonSerialize注解指定序列化类
@JsonSerialize(using = UserSerializer.class)
public static class User {}
// 3 测试
public class Test {
	@Test
	public void serializer() throws IOException {
		ObjectMapper objectMapper = new ObjectMapper();
		User user = new User();
		user.setId(1);
		user.setName("ly");
		String json = objectMapper.writeValueAsString(user);
		// 输出    {"uid":1,"uname":"ly"}
		System.out.println(json);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_38229356/article/details/84075299