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)
完美的工作.
对象映射器不起作用?应该只是:
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)
归档时间: |
|
查看次数: |
6716 次 |
最近记录: |