限制REST API的JSON响应中的字段?

时间:2013-12-27 14:00:48

标签: java json spring rest spring-mvc

我正在使用Spring和Java并实现基于REST的服务。我有一组为移动,iPad和Web开发的开发人员。考虑我有一个豆

Class User{
private String Name;
private Integer id;
private String photoURL;
private ArrayList<String> ProjectName;
private ArrayList<String> TechnologyList;
private ArrayList<String> InterestList;

//Getters and setters

}

虽然网络开发人员需要整个领域,而移动开发人员只需要两个字段,而iPad需要移动和网络之间的东西。

由于我使用jackson作为解析器,有没有办法在向控制器请求时我可以指定我需要的所有数据并避免其他数据。例如,考虑我做一个像

这样的GET请求
GET>http://somedomain.com/users?filter=name,id,photoUrl

它返回一个类似

的JSON结构
{
"name":"My Name",
"id":32434,
"photoUrl":"/sss/photo.jpg"
}

如果有人要求更多字段,可以过滤它们。请让我知道如何做到这一点,以便我的API保持通用和可用于所有人。

2 个答案:

答案 0 :(得分:5)

你可以达到你想要的效果,但还需要一些额外的工作。我可以为您提供两种解决方案。

1。返回Map

只需将请求的每个属性放入地图即可。

2。直接使用Jacksons Object Mapper

Jackson允许您设置过滤器,指定序列化或忽略哪些属性。

FilterProvider filter = new SimpleFilterProvider().addFilter("myFilter",
   SimpleBeanPropertyFilter.filterOutAllExcept(requestedProperties));

String json = objectMapper.writer(filter).writeValueAsString(value);

然后,您可以直接返回JSON字符串而不是对象。

对于这两种解决方案,您最好写一个完成工作的类。但如果你这样做,你也可以编写自己的消息转换器。例如,您可以扩展MappingJackson2HttpMessageConverter并覆盖writeInternal方法以满足您的需求。这具有很大的优势,您无需更换控制器。

答案 1 :(得分:0)

直接的解决方案是实现自定义Jackson JSON序列化程序,它将获取应从线程本地存储序列化的字段名称,然后仅序列化显示名称的字段那个背景。另一方面,在控制器中,您可以从URL获取所有允许的字段名称,并将它们存储到线程本地上下文中。希望这会有所帮助。