如何告诉Jersey Jackson不要序列化一个资源?

时间:2014-06-19 21:24:15

标签: java jersey jackson

我有一个使用Jersey实现的REST API,我使用Jackson功能自动将对象序列化为JSON,有一个特殊情况,我需要返回一个代表脚本的JSON字符串。由于脚本可以具有不同的未知结构,因此我不能将其序列化为Object,该脚本来自db表中的列。同时我有一个完整的Script对象,其中包含DB的所有信息,包括脚本字符串作为String属性。

我想要的是告诉Jersey-Jackson不要序列化(跳过)端点GET / script / {scriptId},看看代码:

@Path("script")
@Produces(MediaType.APPLICATION_JSON)
public class ScriptResource {
    private ScriptService service;    

    @GET
    @Path("{scriptId}")
    public String getScript(@NotNull @PathParam("scriptId") Integer scriptId) {
        return service.getScript(scriptId); // returns a a valid JSON String 
    }


    @GET
    @Path("full/{scriptId}")
    public Script getFullScript(@NotNull @PathParam("scriptId") Integer scriptId) {
        return service.getFullScript(scriptId); // returns a Script object
    }
}

@Produces注释是通过Jackson触发自动转换的注释,我想配置Jackson并排除我不想自动转换的资源端点。

我不想:

  • 将响应用作返回类型
  • 更改Produces注释以避免Jackson
  • 使用Map作为返回类型,我将通过解析String
  • 来提供

2 个答案:

答案 0 :(得分:2)

除了@wasabi提到的那些之外,您还可以考虑的另一个选项是为您的字符串设置一个包装器类,它将自定义Jackson序列化,因此它不会转换为JSON。这可以通过在getter方法上使用@JsonValue@JsonRawValue注释的组合来完成。

以下是一个示例包装器:

public class RawJsonString {
    private final String json;

    public RawJsonString(String json) {
        this.json = json;
    }

    @JsonRawValue
    @JsonValue
    public String getJson() {
        return json;
    }
}

...然后您修改后的资源方法将如下所示:

@GET
@Path("{scriptId}")
public JsonRawString getScript(@NotNull @PathParam("scriptId") Integer scriptId) {
    return new JsonRawString(service.getScript(scriptId)); // returns a a valid JSON String 
}

答案 1 :(得分:0)

如果您只是想确保杰克逊不会将Script类中的某些字段序列化,您可以通过使用@JsonIgnore注释这些字段来轻松完成此操作。

如果您希望更多地控制生成的JSON,我会实现自定义JsonSerializer,并使用Script类中的@JsonSerialize注释来引用它。有关示例,请参阅this post

如果您无法修改Script课程,则还可以实施MessageBodyWriter。有关示例,请参阅this post