2014-06-19 20 views
0

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

我要的是要告诉新泽西州的杰克逊没有序列化(跳过)端点GET /脚本/ {} 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注释是一个触发器通过杰克逊的自动转换,我想配置杰克逊,并排除我不想自动转换的资源端点。

我不想:

  • 使用响应作为返回类型
  • 更改主要生产的注释,以避免杰克逊
  • 使用地图作为返回类型,我会通过饲料解析字符串

回答

0

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

如果您想对生成的JSON有更多的控制权,我会实现一个自定义JsonSerializer,并在您的Script类中使用@JsonSerialize注释引用它。一个例子见this post

如果您不能修改Script班,您也可以实施MessageBodyWriter。一个例子见this post

+0

没有,这个问题是不是在Object忽略的属性,它是关于忽略单个资源方法'getScript()',我不希望杰克逊序列化该方法的结果,我希望它作为一个字符串返回,但不影响我返回的其他方法的对象序列化的对象杰克逊。 – raspacorp

+0

@raspacorp您可以在我的答案中尝试其他两个选项,您可以在其中自定义如何在不影响其他任何内容的情况下对“脚本”进行序列化。它们将适用于返回“脚本”的任何端点。 – wasabi

+0

问题不是关于返回Script的方法,因为我想让Jackson正常工作,问题是关于不返回Script的另一个方法它返回一个String,它是一个有效的JSON String,因此它已经是一个JSON我不想让杰克逊转换它。总之,一个方法返回一个Script对象,另一个方法返回JSON作为String。 – raspacorp

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 
} 
+0

这可能是一个选项,但是在这个问题中,我试图找到如何配置Jersey-Jackson来忽略我不想转换的资源,这样我就不需要为每个包装器编写包装器我可以拥有的情况 – raspacorp

相关问题