一尘不染

如何使用Java返回部分JSON响应?

json

我正在构建RESTful API,并希望为开发人员提供选择以在JSON响应中返回哪些字段的选项。
这篇博客文章显示了几个API(Google,Facebook,LinkedIn)如何允许开发人员自定义响应的示例。这称为部分响应。

一个示例可能看起来像这样:

/users/123?fields=userId,fullname,title

在上面的示例中,API应该返回用户“ 123”的userId,fullName和title字段。

我正在寻找有关如何在我的RESTful Web服务中实现这一点的想法。我目前正在使用CXF(编辑:和Jackson),但愿意尝试另一个JAX-RS实现。

这是我目前拥有的。它返回一个完整的User对象。如何仅基于“字段”参数返回API调用者在运行时所需的字段?我不想让其他字段为空。我根本不想退货。

@GET
@Path("/{userId}")
@Produces("application/json")
public User getUser(@PathParam("userId") Long userId, 
    @DefaultValue("userId,fullname,title") @QueryParam("fields") String fields) {

User user = userService.findOne(userId);

StringTokenizer st = new StringTokenizer(fields, ",");
while (st.hasMoreTokens()) {

    // here's where i would like to select only the fields i want to return

}
return user;
}

更新:

我遵循了unludo的链接,该链接随后链接到该链接:http
://wiki.fasterxml.com/JacksonFeatureJsonFilter

有了这些信息,我就添加@JsonFilter("myFilter")到了我的域类中。然后,我修改了RESTful服务方法以返回String而不是User,如下所示:

@GET
@Path("/{userId}")
@Produces("application/json")
public String getUser(@PathParam("userId") Long userId,
                    @DefaultValue("userId,fullname,title") @QueryParam("fields") String fields) {

    User user = userService.findOne(userId);

    StringTokenizer st = new StringTokenizer(fields, ",");
    Set<String> filterProperties = new HashSet<String>();
    while (st.hasMoreTokens()) {
        filterProperties.add(st.nextToken());
    }

    ObjectMapper mapper = new ObjectMapper();
    FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter",
                SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));

    try {
        String json = mapper.filteredWriter(filters).writeValueAsString(user);
        return json;
    } catch (IOException e) {
        e.printStackTrace();
    return e.getMessage();
    }
}

我需要做更多测试,但是到目前为止还不错。


阅读 331

收藏
2020-07-27

共1个答案

一尘不染

如果使用Jackson(一个很棒的JSON库-我相信是Java的标准),则可以使用@View批注来过滤所需的结果对象。

我知道您想要动态的东西,所以它有点复杂。您将在这里找到所需的内容:http
:
//www.cowtowncoder.com/blog/archives/2011/02/entry_443.html(请参见
6.完全动态过滤:)@JsonFilter

我会对您找到的解决方案感兴趣。

2020-07-27