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

时间:2014-10-22 15:57:51

标签: moxy jersey-2.0

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

是否可以以编程方式为特定类型(例如Joda DateTime)定义自定义JSON(de)序列化例程(在POJO上没有注释) - 如果是,如何?

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

    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 - 我只想自定义(de)序列化。有没有办法为特定类型插入转换器,如下所示:

registerTypeConverter( MySpecificType.class, CustomReader.class, CustomWriter.class );

1 个答案:

答案 0 :(得分:0)

我想你可能对this wiki article感兴趣。其中大部分涉及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; } } 对其进行注释(如有必要,请在您的应用程序中注册)。我会复制示例代码的完整性,你永远不知道这些东西存活多久了。)

import os
import re
import glob

map_url = dict()

for f1 in glob.glob('*.urls'):
    urls = open(f1,'r')
    for url in urls:
        url = re.sub(r'\n','',url)
        #print url
        if url in map_url:
            count = map_url[url]
            count = count + 1
            map_url[url] = count
            #print url,count
        else:
            map_url[url] = 1
            #print url,1

print map_url