如何在一行代码中配置 JacksonJaxbJsonProvider?

max*_*yme 4 java json jaxb jackson

我在 REST 应用程序中使用 Jackson 进行 JSON 序列化,如下所示:

import javax.ws.rs.core.Application;

import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.map.SerializationConfig;

public class MyApplication extends Application {

    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(MyResource1.class);
        classes.add(MyResource2.class);
        ...
        return classes;
    }

    public Set<Object> getSingletons() {
        Set<Object> singletons = new HashSet<Object>();
        singletons.add(new JacksonJaxbJsonProvider().configure(
            SerializationConfig.Feature.WRITE_NULL_PROPERTIES, false)); // (*)
        return singletons;
    }

}
Run Code Online (Sandbox Code Playgroud)

(*) 必要的否则用@XmlElementRef 注释的字段将出现在JSON 输出中,"myField": null当为空时(而不是不出现),而用@XmlElement 注释的字段也可以。

然而,SerializationConfig.Feature.WRITE_NULL_PROPERTIES不推荐使用 of以支持SerializationConfig.setSerializationInclusion(..)(1) 其本身已被弃用以支持SerializationConfig.withSerializationInclusion(..)通过 ObjectMapper (2)配置

但是我认为使用new JacksonJaxbJsonProvider().configure(..)确实配置了一个ObjectMapper(我看了一下代码)。

所以我的问题是:如何在不使用任何已弃用的属性并且不(重新)创建新的配置类的情况下正确配置它?

(1) http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/SerializationConfig.Feature.html#WRITE_NULL_PROPERTIES

(2) http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/SerializationConfig.html#setSerializationInclusion(org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion)

iMy*_*sak 5

我使用下一个配置和 OM:

public class JaxbJacksonObjectMapper extends ObjectMapper {

    public JaxbJacksonObjectMapper() {
        configure(Feature.WRAP_ROOT_VALUE, false); // IMPORTANT must be false
        configure(Feature.WRITE_EMPTY_JSON_ARRAYS, true);
        configure(Feature.WRAP_EXCEPTIONS, true);
        configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        final AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();

        super.getSerializationConfig().withSerializationInclusion(Inclusion.ALWAYS);
        super.getDeserializationConfig()
                .withAnnotationIntrospector(introspector);
        super.getSerializationConfig()
                .withAnnotationIntrospector(introspector);

    }

}
Run Code Online (Sandbox Code Playgroud)

希望有帮助

UPD:抱歉,我忘记了下一部分。您还需要注册它,例如:

@Provider
public final class ReContextResolver implements ContextResolver<ObjectMapper> {

    private final ObjectMapper jacksonObjectMapper;

    public ReContextResolver() throws Exception {
        jacksonObjectMapper = new JaxbJacksonObjectMapper();
    }

    @Override
    public ObjectMapper getContext(final Class<?> objectType) {
        return jacksonObjectMapper;
    }

}
Run Code Online (Sandbox Code Playgroud)

你可以将它组合在一个类中,对我来说——我使用 POJO 映射和直接解析,所以对我来说它更好。