如何通过杰克逊传递原始JSON?

Jac*_*icz 13 java json cxf jax-rs jackson

我们在Apache CXF和Jackson之上运行了一整套JAX-RS REST服务.我们使用JAXB注释来处理将POJO编组为JSON,效果很好.

但是,我们有一两个地方要返回原始JSON字符串(我们从Redis缓存中获取).

杰克逊总是将字符串用双引号括起来,并将其中的所有双引号都删掉,例如

@GET @Produces("application/json")
public Response getData() {

    String json = ...get from Redis...
    return Response.ok(json,"application/json").build() 
}
Run Code Online (Sandbox Code Playgroud)

给我们

"{\"test\":1}"
Run Code Online (Sandbox Code Playgroud)

代替

{"test":1}
Run Code Online (Sandbox Code Playgroud)

我尝试过多种方法,将RawSerializer(String.class)添加到Object映射器中,没有任何效果.唯一有效的是,如果我将媒体类型设置为普通字符串,绕过杰克逊,但是不好,因为我返回了错误的内容类型

return Response.ok(json,"text/plain").build() 
Run Code Online (Sandbox Code Playgroud)

工作,但很差(错误的内容类型,这搞砸了.Net WCF应用程序打电话给我们)

Jac*_*icz 10

最后找到了解决方案.诀窍是扩展JacksonJsonProvider(我们在CXF中使用它来强制它使用Jackson而不是Jettison)并告诉它在处理原始字符串时完全绕过Jackson:

public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType){
    if (String.class.equals(type)) {
        //pass strings as-is, they are most likely cached JSON responses
        return false;
    } else {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

完美的工作.


dar*_*rdo 0

对象映射器不起作用?应该只是:

ObjectMapper mapper = new ObjectMapper()
MyObj obj = MyObj();
...set values...
String jsonRes = mapper.writeValueAsString(obj);
return Response.ok(jsonRes, MediaType.APPLICATION_JSON).build();
Run Code Online (Sandbox Code Playgroud)