我正在使用杰克逊提供商进行休息服务:
<jaxrs:server id="services" address="/">
<jaxrs:serviceBeans>
<bean class="..."/>
</jaxrs:serviceBeans>
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
</jaxrs:providers>
</jaxrs:server>
我有这堂课:
public class Response {
private Date myDate;
private DataObject data; //data related to that date
}
这个方法返回一个json:
@Produces("application/json")
public Response getResp(){
Response r = ...
return r;
}
这将转换为以下json对象
{
"myDate":"20150730",
"data":{
"p1":"v1",
"p2":"v2"
}
}
是否有可能获得这样的东西,而不是:
"20150730":{
"p1":"v1",
"p2":"v2"
}
换句话说,将 myDate 内容作为实际的json属性,将数据内容作为json值?
答案 0 :(得分:2)
你可以write your own serializer。例如
$ sh test.sh
Got error
$ echo $?
0
$
我不知道你的import java.io.IOException;
import java.text.SimpleDateFormat;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
public class ResponseSerializer extends JsonSerializer<Response> {
@Override
public void serialize(Response resp, JsonGenerator jg, SerializerProvider sp)
throws IOException, JsonProcessingException {
jg.writeStartObject();
String dateString = new SimpleDateFormat("yyyyMMdd").format(resp.myDate);
jg.writeObjectField(dateString, resp.data);
jg.writeEndObject();
}
}
对象是什么。我假设它Date
所以我刚创建了一个格式化程序。所有这些序列化程序都会添加日期字符串作为键和java.util.Date
以及值。
然后,您需要使用ObjectData
注册序列化程序。你可以用ObjectMapper
(这是一种配置映射器的JAX-RS方式)来做到这一点
ContextResolver
然后就像注册xml配置中的任何其他提供程序一样注册@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper>{
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
SimpleModule module = new SimpleModule(
"ResponseModule", new Version(1, 0, 0, null)
);
module.addSerializer(Response.class, new ResponseSerializer());
mapper.registerModule(module);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
。