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

2024-04-04

我正在构建一个 RESTful API,并希望为开发人员提供选择在 JSON 响应中返回哪些字段的选项。这篇博文 http://blog.apigee.com/detail/restful_api_design_can_your_api_give_developers_just_the_information/显示了多个 API(Google、Facebook、LinkedIn)如何允许开发人员自定义响应的示例。这称为部分响应。

一个例子可能如下所示:

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

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

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

这是我目前所拥有的。它返回一个完整的 User 对象。如何根据“fields”参数仅返回 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;
}

UPDATE:

我点击了 unludo 的链接,然后链接到此:http://wiki.fasterxml.com/JacksonFeatureJsonFilter 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 http://www.cowtowncoder.com/blog/archives/2011/02/entry_443.html(看6.全动态过滤:@JsonFilter).

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Java 返回部分 JSON 响应? 的相关文章

随机推荐

  • Android 每 4 秒运行一个任务

    您好 我需要每 4 秒调用一个方法 即使设备处于睡眠状态 我使用带有服务 Start stick 的警报管理器 服务名称为 TransactionService 当设备处于活动状态并且每 4 秒调用一次该方法时 代码运行良好 但是当屏幕锁定
  • Django+MongoDB 与 Node.js+MongoDB

    我已经建立并运行了一个带有使用 Python Django MySQL 构建的同步服务的网站 很长一段时间以来 我一直在关注 Node js 和 MongoDB 方面 我即将做出决定 将系统的一部分迁移到 MongoDB 该系统托管来自用户
  • 在回发期间保留 C# 对象

    我有一个 asp net 页面 其中包含 C 代码隐藏 它在 Page Load 方法中执行一些操作 例如查询数据库并进行一些其他调用以使用数据填充对象 然后我在页面上显示这些数据 这一切都很好 我设置了几个回发 以便当单击列表框中的值时
  • R中按字符串列名聚合

    我想按两列对 data frame 中的数据进行分组 然后对特定的第三列进行求和 例如 gt aggregate mpg gear cyl data mtcars FUN sum gear cyl mpg 1 3 4 21 5 2 4 4
  • GUI 开发人员如何处理可变像素密度?

    当今的显示器在尺寸和分辨率方面具有相当大的范围 例如 我的 34 5 厘米 19 5 厘米显示屏 对角线为 39 6 厘米或 15 6 英寸 具有 1366 768 像素 而对角线为 15 英寸的 MacBook Pro 第三代 具有 28
  • 使用 dplyr 将组汇总为区间

    H 我有一个像这样的数据框 d lt data frame v1 seq 0 9 9 0 1 v2 rnorm 100 v3 rnorm 100 gt head d v1 v2 v3 1 0 0 0 01431916 0 5005415 2
  • 如何使用 JodaTime 获取一年中的天数?

    我已尝试以下方法但无济于事 new Period Years ONE getDays new Period 1 0 0 000 getDays 我想要的答案显然是365 你想要的答案并不明显365 它是365 or 366 您在示例中没有考
  • Rancher - 如何公开我的服务?

    我有一个正在运行的 Rancher 设置 如下所示 主机 运行牧场主 https github com rancher rancher容器 在公共IP上 无法从 Internet 访问专用网络 10 1 1 0 24 中的节点 我的目标是使
  • bootstrap-vue 选择带有过滤器选项的组件?

    在带有 bootstrap vue 的 vue 项目中 我搜索选择组件的工作原理https bootstrap vue js org docs components form select https bootstrap vue js or
  • 在同一个“分配”对象上多次调用初始化程序是否安全?

    我可以构建一个UIImageView对象与myImageView UIImageView alloc initWithImage image 如果我想更改 UIImageView 上的图像 则影响显示的应用程序活动如下 我可以通过重新分配它
  • 现代 x86 成本模型

    我正在编写一个带有 x86 后端的 JIT 编译器 并一边学习 x86 汇编程序和机器代码 我大约 20 年前使用过 ARM 汇编器 对这些架构之间成本模型的差异感到惊讶 具体来说 内存访问和分支在 ARM 上的成本很高 但等效的堆栈操作和
  • 当模态弹出窗口打开时,防止移动“后退按钮”退出网站,而是关闭弹出窗口

    当模式弹出对话框打开时 即使我添加关闭按钮 通常是右上角的 X 移动设备上的一些用户也会使用移动设备的 后退按钮 来关闭弹出窗口 但这将退出该网站 如何让手机 后退按钮 关闭弹窗而不是退出网站 document getElementById
  • Firebase - 更改我的项目的国家/地区

    我在 firebase 中创建项目时错误地选择了错误的国家 地区 正如你在这里看到的 这可以解决吗 我知道项目 ID 无法更改 而且我喜欢我选择的 ID As 文档说 https firebase google com support gu
  • Apollo 3 分页与字段策略

    有人可以提供使用 Apollo Client 3 0 字段策略实现分页的示例吗 我一直在遵循文档中的示例来实现无限滚动 但在我的控制台中我收到以下警告 The updateQuery callback for fetchMore is de
  • 有没有比输入 | 更快的方法来计算 powershell 中的行数?测量对象[重复]

    这个问题在这里已经有答案了 我使用的是 macbook m1 当我使用本机时wc l file我闪电般地得到结果 几乎可以肯定是因为我可以直接传递文件 但是 我不知道如何使用 powershell 执行此操作 并且我被迫将数据汇集到stdo
  • UISwipeGestureRecognizer 被调用两次

    我正在实施的视图遇到问题 这是一个在 CATiledLayer 中显示 pdf 页面的视图 该平铺视图位于 UISCrollView 内部 我让视图控制自身作为 ZoomingPDFView 苹果示例 我做了一些修改 以便在未启用滚动时识别
  • 我如何使用 Python Tornado 通过 HTTP 实现“tail”?

    我正在尝试使用 Python 通过 HTTP 实现类似 tail f 的东西 目前 我正在尝试使用 Tornado 但它一次只能处理一个连接 即使我执行异步请求也是如此 import socket import subprocess imp
  • Android:如何创建带有文本的闪屏

    如何向启动屏幕添加一些文本 我的启动画面不是一个单独的活动 我不想将其作为标准活动 我按照这篇文章创建了它 https android jlelse eu launch screen in android the right way aca
  • 在php中计算地球上两个坐标之间的行驶距离

    好吧 我正在基于位置的应用程序中工作 我需要在服务器端找到地球上两个位置之间的驾驶距离 我正在用 php 编写 Web 服务 到目前为止 我可以使用半正弦公式计算空中距离 但现在我想计算行驶距离 这个问题可能有重复 但我无法找到任何帮助来计
  • 如何使用 Java 返回部分 JSON 响应?

    我正在构建一个 RESTful API 并希望为开发人员提供选择在 JSON 响应中返回哪些字段的选项 这篇博文 http blog apigee com detail restful api design can your api giv