如何通过 Jackson 传递原始 JSON?

2022-09-04 03:54:00

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

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

Jackson 总是将字符串括在双引号中,并转义其中的所有双引号,例如

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

    String json = ...get from Redis...
    return Response.ok(json,"application/json").build() 
}

给我们

"{\"test\":1}"

而不是

{"test":1}

我已经尝试了多种方法,将RawSerializer(String.class)添加到对象映射器中,没有任何效果。唯一有效的是,如果我将媒体类型设置为纯字符串,这绕过了Jackson,但并不好,因为我返回了错误的内容类型

return Response.ok(json,"text/plain").build() 

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


答案 1

终于找到了解决方案。诀窍是扩展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;
    }
}

完美工作。


答案 2

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

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