我有一个使用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并排除我不想自动转换的资源端点。
我不想:
答案 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。