使用Jersey 2.x/MOXy进行自定义JSON序列化

4

我正在使用内置MOXy转换从JSON <--> POJO的Jersey 2.x,嵌入式Jetty 9.x服务器。

是否可以编程定义特定类型(例如Joda DateTime)的自定义JSON(反)序列化例程(而不使用POJO上的注释) - 如果可以,如何实现?

目前,我已经配置了以下代码,用于将Jersey与我的嵌入式Jetty服务器实例配合使用:

    ResourceConfig resourceConfig = new ResourceConfig();
    resourceConfig.packages( "com.company.app.rest.v1" );
    resourceConfig.register( new GZipEncoder() );
    resourceConfig.register( new LoggingFilter() );
    ServletHolder servletHolder = new ServletHolder( new ServletContainer( resourceConfig ) );

    context.addServlet( servletHolder, "/rest/v1/*" );

对于简单的POJO,它可以正常工作 - 我只想能够自定义(反)序列化。是否有一种方法可以按照以下方式插入特定类型的转换器:

registerTypeConverter( MySpecificType.class, CustomReader.class, CustomWriter.class );
1个回答

0

我认为你可能对这篇维基文章感兴趣。大部分内容都与XML序列化有关,但在底部你会找到如何自定义JSON序列化的方法。

基本上,你需要创建一个自定义的ContextResolver<JAXBContext>,它返回一个自定义的JSONJAXBContext,该对象又具有自定义的JSONConfiguration。别忘了用@Provider进行注释(如果需要,请在应用程序中注册它)。为了完整起见,我将复制示例代码,毕竟你永远不知道这些东西能存在多久 :)

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {

    private JAXBContext context;
    private Class[] types = { Address.class, Customer.class, CustomerResource.class };

    public JAXBContextResolver() throws Exception {
        this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), types);
    }

    public JAXBContext getContext(Class<?> objectType) {
        for (Class type : types) {
            if (type == objectType) {
                return context;
            }
        }
        return null;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接