【问题标题】:Naming a json property after a variable value在变量值之后命名 json 属性
【发布时间】:2015-07-30 08:03:22
【问题描述】:

我正在使用 jackson 提供程序来提供我的休息服务:

<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 属性,将 data 内容作为 json 值?

【问题讨论】:

    标签: java jackson jax-rs


    【解决方案1】:

    你可以write your own serializer。例如

    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注册序列化器。您可以在 ContextResolver 中执行此操作(这是配置映射器的 JAX-RS 方式)

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

    然后只需像在 xml 配置中注册任何其他提供程序一样注册 ObjectMapperContextResolver

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2016-08-23
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多