我使用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 );
答案 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