Java 以变量值命名json属性

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

我正在使用jackson提供商提供我的rest服务:

<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;
    }
}