当前位置: 首页 > 面试题库 >

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

诸葛品
2023-03-14
问题内容

我正在构建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();
    }
}

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


问题答案:

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

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

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



 类似资料:
  • 我使用Guzzle发出一个异步请求,返回JSON。呼叫工作正常,响应正常,但是: 如果我回应- 我需要使用 JSON 来验证来自服务的响应。我该怎么做?我已经浏览了文档,但我显然错过了一些东西。 本质上类似于将json getbody输出分配给$json: 感谢任何帮助问候

  • 我制作了一个返回UserSettings对象数组的服务: 当我在URL http://localhost:8181/settings?ids=123&fields=customdata,user_id上发出GET请求时,我会得到以下信息:

  • 我希望在spring boot中返回类似以下内容的json响应: 我的RestController如下所示 但我得到的反应是这样的

  • 我有一个使用Spring Boot的APIendpoint。这个endpoint所做的是调用另外两个APIendpoint并处理它们的响应。 该过程的前半部分调用一个 API 终结点,获取响应并将此响应与 202 Accepted 一起返回到表面。 在202被返回之后,后台正在经历该过程的第二部分。它从第一个API调用中获取响应并进一步处理它。 我尝试过使用或,但它们在返回202之后都停止了,并且

  • 问题内容: 我想知道如何对方法返回List的JSON数组,例如: 我想知道如何在我的方法中接收List参数类型 我已经阅读了有关JaxbContext的文章,我了解它如何为我提供帮助。 问题答案: 使用JAXB时,支持两种类型。第一个是元素列表,第二个是元素定界字符串(“常规” XML值或属性,使用某些定界符将其解析为列表)。第一个似乎是您想要的(“数组”)。 有关参考,请参见:http : //

  • 问题内容: 我在Java中具有JSON序列化对象的字符串表示形式,例如。我如何解析并将其返回到JavaScript上下文,就像在JS中一样?谢谢。 问题答案: Rhino的最新版本只有四个arg,第四个不能为null。为了解决这个问题,您必须创建一个实现org.mozilla.javascript.Callable的简单类: 然后可以像这样调用NativeJSON.parse: