限制REST API的JSON响应中的字段?
我正在使用Spring和Java并实现基于REST的服务。 我有一组为移动,iPad和Web开发的开发人员。 考虑我有一个豆子
Class User{ private String Name; private Integer id; private String photoURL; private ArrayList ProjectName; private ArrayList TechnologyList; private ArrayList InterestList; //Getters and setters }
虽然Web开发人员需要整个领域,而移动开发人员只需要两个字段,而iPad需要移动和网络之间的东西。
由于我使用jackson作为解析器,有没有办法在请求控制器时我可以指定我需要的所有数据并避免其他数据。 例如,考虑我做一个GET请求
GET>http://somedomain.com/users?filter=name,id,photoUrl
这给我带来了类似的JSON结构
{ "name":"My Name", "id":32434, "photoUrl":"/sss/photo.jpg" }
Sameway如果有人要求更多字段,可以过滤它们。 请让我知道如何做到这一点,以便我的API保持通用和可用于所有人。
你可以达到你想要的效果,但还需要一些额外的工作。 我可以为您提供两种解决方案。
1.返回Map
只需将请求的每个属性放入地图即可。
2.直接使用Jacksons Object Mapper
Jackson允许您设置filter,指定序列化或忽略哪些属性。
FilterProvider filter = new SimpleFilterProvider().addFilter("myFilter", SimpleBeanPropertyFilter.filterOutAllExcept(requestedProperties)); String json = objectMapper.writer(filter).writeValueAsString(value);
然后,您可以直接返回JSON字符串而不是对象。
对于这两种解决方案,您最好编写一个完成工作的类。 但是,如果你这样做,你也可以编写自己的消息转换器。 例如,您可以扩展MappingJackson2HttpMessageConverter
,并覆盖writeInternal
方法以满足您的需要。 这有一个很大的好处,你不需要更改你的控制器。
直接的解决方案是实现自定义Jackson JSON序列化程序 ,该序列化程序将获取应从线程本地存储序列化的字段名称,然后仅序列化在该上下文中显示的名称的字段。 另一方面,在控制器中,您可以从URL获取所有允许的字段名称,并将它们存储到线程本地上下文中。 希望这可以帮助。