泽西休息 - 如何根据请求参数缩进json输出?

时间:2015-08-10 19:17:14

标签: java rest jersey

我需要根据请求参数来美化json。如果美化请求参数为真,则缩进json输出。有没有办法将此参数注入Jersey并自动缩进。

以下是我的休息服务的示例方法

@Path("/{manageElement}")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Object update(@Context SecurityContext context,
        @PathParam(MANAGED_ELEMENET) String manageElement, @QueryParam("prettify") boolean prettyOutput, String content) {
    LOG.debug("started update.");

    Request request = new Request();
    request.setActionType(ActionType.UPDATE_ME);
    request.setRequestBody(content);
    request.setManageElement(manageElement);
    request.setRequester(GENERIC_USER);

    return service.service(request);
}

2 个答案:

答案 0 :(得分:0)

我不认为使用Jersey的默认序列化器/反序列化器,您可以在创建后更改它。它在启动时注册,但您可以使用自己的序列化器/反序列化器并返回类似这样的响应。我过去主要使用Gson:

irb(main):001:0> Time.now.to_s(:db)
ArgumentError: wrong number of arguments (1 for 0)
        from (irb):1:in `to_s'
        from (irb):1
        from C:/Ruby22/bin/irb:11:in `<main>'

在球衣示例中有一个示例,它显示了如何注册自定义提供程序,但没有指示将其更改为运行时:jersey doc

答案 1 :(得分:0)

假设您使用Jackson,您可以在ContextResolver中配置两个不同的ObjectMapper,并根据查询参数确定要使用的映射器。有点像this answer中所见。

链接的答案尝试获取路径参数,但要获取查询参数,只需使用

String param = uriInfo.getQueryParameters().getFirst("prettify");
if (param != null) { 
    boolean prettify = Boolean.valueOf(param);
    if (prettify) return prettifyMapper;
}
return regularMapper;

要使用Jackson获取格式化输出,具体取决于您可以执行的版本:

杰克逊1.x

ObjectMapper prettifyMapper = new ObjectMapper();
prettifyMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
杰克逊2.x

ObjectMapper prettifyMapper = new ObjectMapper();
prettifyMapper.enable(SerializationFeature.INDENT_OUTPUT);