自定义Json序列化器而不是Jersey的默认值?

时间:2016-05-20 06:37:28

标签: java json jersey jackson jax-rs

我正在使用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吗?

1 个答案:

答案 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