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

3

我正在使用Spring和Java实现基于REST的服务。我有一组为移动设备、iPad和Web开发的开发人员。假设我有一个bean。

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需要介于移动和Web之间的某些东西。

由于我正在使用jackson作为解析器,是否有一种方式可以在请求控制器时指定我需要哪些数据并避免其他数据。例如,考虑我执行一个GET请求,如下:

GET>http://somedomain.com/users?filter=name,id,photoUrl

这会返回给我一个JSON结构,类似于:

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

如果有人要求添加更多字段,可以进行筛选。请告诉我如何做到让我的API保持通用和可用性。


你的控制器方法是否返回一个 User 对象? - a better oliver
@zeroflagL 是的,我确实从那里返回它。 - Shiv Kumar Ganesh
2个回答

5
你可以实现你想要的目标,但需要进行额外的工作。我可以提供两个解决方案。

1. 返回一个Map

简单地将所有被请求的属性放入map中即可。

2. 直接使用Jackson的对象映射器

Jackson允许您设置过滤器,指定哪些属性需要被序列化或忽略。
FilterProvider filter = new SimpleFilterProvider().addFilter("myFilter",
   SimpleBeanPropertyFilter.filterOutAllExcept(requestedProperties));

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

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

对于这两种解决方案,最好编写一个执行此任务的类。但如果您这样做,您可以编写自己的消息转换器。例如,您可以扩展MappingJackson2HttpMessageConverter并覆盖writeInternal方法以满足您的需求。这样做的最大优点是您无需更改控制器。


注意:您还需要使用 @JsonFilter("myFilter") 注释要筛选属性的类。 - Relefant

0

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


@Shiv Kumar Ganesh,请查看以下内容:Wikipedia上的线程本地存储Java线程本地存储Spring请求范围Bean - nndru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接