We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
// 或者 spring.jackson.serialization.write_enums_using_index=true @Bean public Jackson2ObjectMapperBuilderCustomizer customizer(){ return builder -> builder.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_INDEX); }
@JsonCreator
@JsonProperty
read_unknown_enum_values_using_default_value
@JsonEnumDefaultValue UNKNOWN(-1, "未知");
@JsonValue
@Slf4j @Getter @AllArgsConstructor public enum StatusEnumClient { CREATED(1, "已创建"), PAID(2, "已支付"), DELIVERED(3, "已送到"), FINISHED(4, "已完成"), @JsonEnumDefaultValue UNKNOWN(-1, "未知"); @JsonValue private final int status; private final String desc; } @Bean public Jackson2ObjectMapperBuilderCustomizer customizer() { return builder -> { builder.locale(Locale.CHINA); builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault())); builder.simpleDateFormat(DatePattern.NORM_DATETIME_PATTERN); builder.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_INDEX); // spring.jackson.deserialization.read_unknown_enum_values_using_default_value=true builder.featuresToEnable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE); SimpleModule module = new SimpleModule(); module.addDeserializer(Enum.class, new EnumDeserializer()); builder.modules(module); }; } @Bean public RestTemplate restTemplate(MappingJackson2HttpMessageConverter converter) { return new RestTemplateBuilder().additionalMessageConverters(converter).build(); } @Slf4j @NoArgsConstructor @AllArgsConstructor public class EnumDeserializer extends JsonDeserializer<Enum> implements ContextualDeserializer { private Class<Enum> targetClass; @Override public Enum deserialize(JsonParser p, DeserializationContext ctxt) { // 找枚举中带有@JsonValue注解的字段,这个字段是我们反序列化的基准字段 Optional<Field> valueFieldOpt = Arrays.asList(targetClass.getDeclaredFields()).stream() .filter(m -> m.isAnnotationPresent(JsonValue.class)).findFirst(); if (valueFieldOpt.isPresent()) { Field valueField = valueFieldOpt.get(); if (!valueField.isAccessible()) { valueField.setAccessible(true); } // 遍历枚举项,查找字段的值等于反序列化的字符串的那个枚举项 return Arrays.stream(targetClass.getEnumConstants()) .filter(e -> valueField.get(e).toString().equals(p.getValueAsString())) .findFirst() .orElseGet( () -> Arrays.stream(targetClass.getEnumConstants()) .filter(e -> { // 如果找不到,那么就需要寻找默认枚举值来替代,同样遍历所有枚举项,查找@JsonEnumDefaultValue注解标识的枚举项 return targetClass.getField(e.name()).isAnnotationPresent(JsonEnumDefaultValue.class); }) .findFirst().orElse(null)); } return null; } @Override public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException { targetClass = (Class<Enum>) ctxt.getContextualType().getRawClass(); return new EnumDeserializer(targetClass); } }
The text was updated successfully, but these errors were encountered:
LocalDate.now().query() || .with()
ChronoUnit.DAYS.between(specifyDate, today)
Sorry, something went wrong.
Alice52
No branches or pull requests
15. Serialize & Enum
@JsonCreator
来指定构造方法@JsonProperty
设置构造方法中参数对应的 JSON 属性名read_unknown_enum_values_using_default_value
@JsonEnumDefaultValue UNKNOWN(-1, "未知");
@JsonValue
@JsonValue
字段: 自定义一个 EnumDeserializer, 并注册到 jackson 配置中The text was updated successfully, but these errors were encountered: