当前位置: 首页 > 工具软件 > Jackson > 使用案例 >

Jackson配置-jackson注解

田镜
2023-12-01

Jackson配置

Jackson相关的配置在MapperFeatrue这个枚举类中,查看源码可以发现可配置项及其默认值

Java Configuration配置demo

通常情况下,配置文件和Jackson的注解可以满足需求,如需更多的定制化配置,可能需要JavaConfig

@Configuration
public class JacksonConfig {
    @Primary
    @Bean
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {

        JsonSerializer<RestPage<?>> serializer = new JsonSerializer<RestPage<?>>() {
            @Override
            public void serialize(RestPage<?> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                gen.writeStartObject();
                gen.writeNumberField("current", value.getCurrent());
                gen.writeObjectField("records", value.getRecords());
                Class<?> activeView = serializers.getActiveView();
                if (activeView != null && activeView.equals(RestPage.WithNameView.class)) {
                    gen.writeStringField("name", value.getName());
                }
                gen.writeEndObject();
            }
        };
        builder.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.NON_PRIVATE);
        builder.serializationInclusion(JsonInclude.Include.NON_NULL);
        builder.dateFormat(new SimpleDateFormat("yyyy-MM-dd"));
        builder.timeZone(ZoneOffset.UTC.getId());
        builder.defaultViewInclusion(true);
        builder.serializerByType(RestPage.class, serializer);
        return builder.createXmlMapper(false).build();
    }
}

Jackson注解

注解在

  • com.fasterxml.jackson.annotation
  • com.fasterxml.jackson.databind.annotation

@JsonValue

可注解在注解、方法、属性上

  • 一个类只能有一个方法或字段有此注解
  • 方法的返回值或字段值为可序列化对象
  • 被注解方法返回值的结果为该类的序列化结果

例如注解在toString方法中,该类的序列化结果为toString返回的字符串

以下将会返回Employee对象的序列化结果

@JsonValue
public Employee employee() {
	Employee employee = new Employee();
	employee.setEmpNo(100L);
	employee.setHireDate(new Date());
	return employee;
}

@JsonView

可注解在注解、方法、属性、参数、类上

按场景序列化字段,例如某些场景下需要序列化密码,某些场景下不应序列化密码

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonView(UserInfo.class)
private String username;
@JsonView(UserDetail.class)
@JsonProperty("pwd")
private String password;

/* 默认所有字段defaultView */
System.out.println(objectMapper.writeValueAsString(user));
/* userInfoView,序列化userInfoView和defaultView */
System.out.println(objectMapper
		.writerWithView(User.UserInfo.class)
		.writeValueAsString(user));
/* userDetailView,序列化userDetailView和defaultView */ 
/* userDetailView继承自userInfo */
System.out.println(objectMapper
		.writerWithView(User.UserDetail.class)
		.writeValueAsString(user));

在SpringMVC中,可用于controller层方法上控制不同的序列化结果

@JsonUnwrapped

可注解在注解、属性、方法、参数

当属性为Java Bean时,展平序列化结果,只有一层,不会嵌套

@JsonTypeInfo、@JsonTypeName

可注解于类、方法、参数、字段、注解

  • 可向序列化结果中添加类型信息
  • 可定义类型信息的格式

类似的注解还有@JsonTypeId、@JsonSubTypes等,不常用

@JsonProperty、@JsonGetter、@JsonSetter

可注解在注解、属性、方法、参数
@JsonProperty可用于设置序列化反序列化别名

@JsonProperty = @JsonGetter + @JsonSetter

@JsonRawValue

序列化的值为toString方法,且不带双引号

@JsonPropertyOrder

注解在注解、字段、方法
序列化指定字段顺序

@JsonAnyGetter、@JsonAnySetter

注解 方法、字段,注解

方法返回值为Map,其中的key、value会被序列化到结果中
@JsonAnySetter,与其相对

@JsonIgnore、@JsonIgnoreProperties

忽略字段或方法

@JsonIgnoreType

注解在类上,该类不会被序列化、反序列化

@JsonInclude

常用的注解

NON_NULL为null是不序列化
NON_EMPTY,为空时不序列化
CUSTOME,自定义过滤器

@JsonSerialize、@JsonDeserialize

指定实现JsonSerializer或Deserializer接口的类自定义序列化及反序列化行为

@JsonCreator

指定反序列的构造器
注解在构造方法、静态方法上

  • 若只有一个参数,自写代码解析这个参数,返回对象
  • 若多个参数,请使用@JsonProperty注解参数

@JsonFormat

指定序列化的格式,比如时间日期格式,比如Number类型序列化字符串

 类似资料: