我正在使用Jersey来实现RESTful webservice。现在我返回数据的MediaType是JSON。
@GET
@Produces({MediaType.APPLICATION_JSON })
public Response service() {
return Response
.ok(entity)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.build();
}
这里我将CONTENT_TYPE
设置为json,我的实体将由Jersey框架转换为json。
现在我想自定义我的json响应。
例如:我想删除空元素或更改我的Json对象的键名。 默认泽西岛的Json转换:
{
"cinter" : {
"state" : 1,
"checks" : 10,
}
}
我想要的是什么:
{
"cin" : {
"st" : 1,
"cs" : 10,
}
}
我知道我可以使用杰克逊图书馆自己ObjectMapper
根据我的需要自定义我的Json。
但是,如果我想以不同于泽西岛默认转换的方式进行JSON转换,这是否是标准方法?
或者我可以在Jersey的ObjectMapper中改变参数吗?
我应该使用自己的ObjectMapper
吗?
答案 0 :(得分:4)
以下是我对您的选择的看法。首先
因此,对于每个不同的响应,我应该配置ObjectMapper 不同吗?
如果你想在不同的地方使用这两个json版本
ObjectMappers
比你好,你必须使用多个public class TestBean {
private String name;
private int id;
//getters and setters
}
public interface TestBeanMixin {
@JsonProperty("short_field_name")
String getName();
@JsonProperty("short_field_id")
int getId();
}
@Provider
@Priority(1)
public class MixInJacksonJsonProvider extends JacksonJaxbJsonProvider {
private static final ObjectMapper mapper = createMapper();
public MixInJacksonJsonProvider() {
setMapper(mapper);
}
private static ObjectMapper createMapper() {
final ObjectMapper result = new ObjectMapper();
result.addMixIn(TestBean.class, TestBeanMixin.class);
return result;
}
}
。
但是如果你只想在任何地方使用1个表示法,那么你可能会为你的课程设置一个自定义mixin设置杰克逊。无论如何,这里是你可以做两个选项的方法:让我们看看只需1个json版本的简单案例
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MixIn {}
此代码将为您的POJO字段生成短名称。并为不同的请求实现不同的行为,我们必须添加新的自定义注释,如下所示:
@Path("test")
public class MyResource {
@GET
@MixIn // <== Here is important part
@Produces(MediaType.APPLICATION_JSON )
public Response getShortName() {
return Response.ok(demoObj()).build();
}
@POST
@Produces(MediaType.APPLICATION_JSON )
public Response postLongName() {
return Response.ok(demoObj()).build();
}
}
控制器将如下所示:
MixInJacksonJsonProvider
我们的@Override
还有2个 //.. same as before
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return super.isReadable(type, genericType, annotations, mediaType) && hasMixInAnnotation(annotations);
}
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return super.isWriteable(type, genericType, annotations, mediaType) && hasMixInAnnotation(annotations);
}
public static boolean hasMixInAnnotation(Annotation[] annotations){
for(Annotation annotation: annotations){
if (annotation instanceof MixIn){
return true;
}
}
return false;
}
}
:
<string-array name="units">
<item>
<u><b><font size ="21"><font color ="red">USA</font></font></b></u>
</item>
</string-array>
以下是演示代码:https://github.com/varren/jersey2-jacksonsetup/tree/master/src/main/java/ru/varren