在Jackson 2x中设置Mapper / Package / Class级别的默认类型解串器

时间:2015-11-20 20:43:13

标签: java json jackson deserialization jackson-modules

如果你需要一个类型的多个反序列化器(打包在一个或多个模块中),Jackson如何确定哪个是该类型的主要解串器?是随机的吗?如果没有,默认值是否可以由包/类设置?

对于每个Jackson类,几乎每个属性都需要指定@JsonDeserialize(using=CustomDeserializer.class)显然是一个完全疯狂的事情 - 我假设有一种方法可以在存在多个反序列化器时设置默认值,但是迄今为止一无所获。

1 个答案:

答案 0 :(得分:1)

好的,我回去看看我过去是怎么做到的。我再次使用Spring。对于我的情况,我想从我的所有输入中删除前导和尾随空格。这是我如何做到的。

在spring xml配置中,我有

<!-- Configures the @Controller model -->
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
  <mvc:message-converters>
    <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
      <property name="prefixJson" value="false"/>
      <property name="supportedMediaTypes" value="application/json"/>
      <property name="objectMapper" ref="customObjectMapper"></property>
    </bean>
  </mvc:message-converters>
</mvc:annotation-driven>
<bean id="customObjectMapper" class="com.domain.json.CustomObjectMapper"/>

这里是CustomObjectMapper类

public class CustomObjectMapper extends ObjectMapper
{
    private static final long serialVersionUID = 1L;

    public CustomObjectMapper()
    {
        registerModule(new StringMapperModule());
    }
}

最后是StringMapperModule类

public class StringMapperModule extends SimpleModule
{
    private static final long serialVersionUID = 1L;

    /**
     * Modify json data globally
     */
    public StringMapperModule()
    {
         super();

        addDeserializer(String.class, new StdScalarDeserializer<String>(String.class)
        {
            private static final long serialVersionUID = 1L;

            @Override
            public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
            {
                // remove leading and trailing whitespace
                return StringUtils.trim(jp.getValueAsString());
            }
        });
    }
}

我希望你觉得这很有帮助,或者至少可以指出你正确的方向。