在变量值后命名json属性

时间:2015-07-30 08:03:23

标签: java jackson jax-rs

我正在使用杰克逊提供商进行休息服务:

<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值?

1 个答案:

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