Spring boot 动态/注解自定义 JSON 反序列化器

Posted

技术标签:

【中文标题】Spring boot 动态/注解自定义 JSON 反序列化器【英文标题】:Spring boot dynamic/annotation custom JSON deserializer 【发布时间】:2019-06-14 00:22:12 【问题描述】:

我已经编写了自定义 JSON 反序列化器,它的工作方式与预期一样,但我的问题是它始终处于打开状态,因为它是在配置级别定义的。

我想在方法或控制器级别的某些自定义注释上禁用它,因此当该注释存在时它不起作用,但是当没有注释时,自定义 JSON 反序列化器可以工作。那可能吗 ?

我的反序列化代码:

@Configuration
public class OwaspConfiguration extends WebMvcConfigurerAdapter

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) 
        converters.add(jsonConverter());
    

    @Bean
    public HttpMessageConverter<?> jsonConverter() 
        SimpleModule module = new SimpleModule();
        module.addDeserializer(String.class, new DefaultJsonSerializer());
        ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().build();
        objectMapper.registerModule(module);
        return new MappingJackson2HttpMessageConverter(objectMapper);
    



public class DefaultJsonSerializer extends JsonDeserializer<String> implements ContextualDeserializer 

    public static final org.owasp.html.PolicyFactory POLICY_FACTORY = new HtmlPolicyBuilder().toFactory();

    @Override
    public String deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException 
        String value = parser.getValueAsString();
        if (StringUtils.isEmpty(value))
            return value;
        else 
            String originalWithUnescaped = unescapeUntilNoHtmlEntityFound(value);
            return unescapeEntities(POLICY_FACTORY.sanitize(originalWithUnescaped), true);
        
    

    @Override
    public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property)
            throws JsonMappingException 
        return this;
    

    private String unescapeUntilNoHtmlEntityFound(final String value) 
        String unescaped = unescapeEntities(value, true);
        if (!unescaped.equals(value))
            return unescapeUntilNoHtmlEntityFound(unescaped);
        else
            return unescaped;
    


【问题讨论】:

查看此答案,了解如何为特定字段使用序列化程序:***.com/questions/45099529/… 您可能正在寻找JSON Views? 【参考方案1】:

使用@JsonDeserialize - 注释用于配置反序列化方面,通过附加到“setter”方法或字段或值类

在你的 DTO 中

@JsonDeserialize(using = StringDeserializer.class)
public String heading;

反序列化器类

public class StringDeserializer extends JsonDeserializer<String> 

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException 
        return p.getValueAsString();
    


【讨论】:

以上是关于Spring boot 动态/注解自定义 JSON 反序列化器的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot中自定义注解

spring boot 自定义Validator注解

Spring Boot 自定义注解支持EL表达式(基于 MethodBasedEvaluationContext 实现)

使用 JSON 使用 Spring Boot 格式化 Java 时间 [重复]

Spring boot 使用@Endpoint注解自定义端点, 不能通过 Restfult 访问问题 原因分析

Spring boot 使用@Endpoint注解自定义端点, 不能通过 Restfult 访问问题 原因分析