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(我看了一下代码)。
所以我的问题是:如何在不使用任何已弃用的属性并且不(重新)创建新的配置类的情况下正确配置它?
我使用下一个配置和 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 映射和直接解析,所以对我来说它更好。
| 归档时间: |
|
| 查看次数: |
15794 次 |
| 最近记录: |