Java 以变量值命名json属性
我正在使用jackson提供商提供我的rest服务:Java 以变量值命名json属性,java,jackson,jax-rs,Java,Jackson,Jax Rs,我正在使用jackson提供商提供我的rest服务: <jaxrs:server id="services" address="/"> <jaxrs:serviceBeans> <bean class="..."/> </jaxrs:serviceBeans> <jaxrs:providers> <bean class="org.codehaus.jackson.jaxrs
<jaxrs:server id="services" address="/">
<jaxrs:serviceBeans>
<bean class="..."/>
</jaxrs:serviceBeans>
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
</jaxrs:providers>
</jaxrs:server>
这个方法返回一个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属性,将data内容作为json值。比如说
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();
}
}
然后只需注册ObjectMapperContextResolver
,就像您在xml配置中注册任何其他提供者一样
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();
}
}
@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;
}
}