Spring REST 服务:如何配置以删除 json 响应中的空对象

2023-11-24

我有一个返回 json 响应的 Spring Web 服务。我使用此处给出的示例来创建服务:http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/

返回的json格式为: {"name":null,"staffName":["kfc-kampar","smith"]}

我想从返回的响应中删除任何空对象,因此它看起来像这样: {"staffName":["kfc-kampar","smith"]}

我发现这里提出了类似的问题,但我已经能够找到有效的解决方案,例如

在 Spring 中配置 ObjectMapper

使用spring基于注解的配置时如何配置MappingJacksonHttpMessageConverter?

配置 jacksonObjectMapper 在 spring mvc 3 中不起作用

如何配置 spring mvc 3 在 json 响应中不返回“null”对象?

Spring配置@ResponseBody JSON格式

Jackson+Spring3.0.5 自定义对象映射器

通过阅读这些和其他来源,我发现实现我想要的最干净的方法是使用 Spring 3.1 和可以在 mvc 注释中配置的消息转换器。 我更新的 spring 配置文件是:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

<context:component-scan base-package="com.mkyong.common.controller" />

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="prefixJson" value="true" />
            <property name="supportedMediaTypes" value="application/json" />
            <property name="objectMapper">
                <bean class="org.codehaus.jackson.map.ObjectMapper">
                    <property name="serializationInclusion" value="NON_NULL"/>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

服务类与 mkyong.com 网站上给出的相同,只是我注释掉了 Shop name 变量的设置,因此它为 null,即

@Controller
@RequestMapping("/kfc/brands")
public class JSONController {
    @RequestMapping(value="{name}", method = RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK) 
    public @ResponseBody Shop getShopInJSON(@PathVariable String name) {
        Shop shop = new Shop();
        //shop.setName(name);
        shop.setStaffName(new String[]{name, "cronin"});
        return shop;
    }
}

我使用的 Jackson jar 是 jackson-mapper-asl 1.9.0 和 jackson-core-asl 1.9.0。这些是我添加到 pom 中的唯一新 jar,作为我从 mkyong.com 下载的 spring-json 项目的一部分提供。

该项目构建成功,但是当我通过浏览器调用该服务时,我仍然得到相同的结果,即 {"name":null,"staffName":["kfc-kampar","smith"]}

谁能告诉我我的配置哪里出了问题?

我尝试了其他几个选项,但能够以正确格式返回 json 的唯一方法是将对象映射器添加到 JSONController 并让“getShopInJSON”方法返回一个字符串,即

public @ResponseBody String getShopInJSON(@PathVariable String name) throws JsonGenerationException, JsonMappingException, IOException {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);

    Shop shop = new Shop();
    //shop.setName(name);
    shop.setStaffName(new String[]{name, "cronin"});
    String test = mapper.writeValueAsString(shop);
    return test;
}

现在,如果我调用该服务,我会得到预期的结果,即 {"staffName":["kfc-kampar","cronin"]}

我还可以使用 @JsonIgnore 注释让它工作,但这个解决方案不适合我。

我不明白为什么它在代码中工作但在配置中不起作用,所以任何帮助都会很棒。


从 Jackson 2.0 开始你可以使用Json包含

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

Spring REST 服务:如何配置以删除 json 响应中的空对象 的相关文章

随机推荐

  • 将 ObservableCollection 绑定到 DataGridView

    我正在将可观察集合 FoodList 绑定到 WinForm 中的 BindingSource 此 BindingSource 由表单上的数据网格使用 我假设当我向集合中添加一个新项目时 它会引发一个事件 并且一个新行会出现在我的网格中 但
  • 如何使用RVM管理多个gemset和ruby版本?

    我对 RVM 网站上给出的解释感到非常困惑 我不清楚不同的红宝石解释器和宝石集之间的关系 按照我的说法 是这样的 我的 Mac 帐户有一个 rvm 该 nvm 安装并管理一组不同版本的 ruby 解释器 每个红宝石版本都有一组宝石 我把事情
  • 从 mongoengine 中的文档获取必填字段?

    我希望能够获取我创建的文档所需的列表或某种字段集 例如 这是我的文档 nickName StringField required True password StringField required True firstName Strin
  • 设置 Fcm 通知优先级 - Azure 通知中心

    我正在尝试在 C SDK 中的 Fcm 通知有效负载上设置高优先级 以便从后端将其发送到移动应用程序 根据 Fcm 文档 Json Paylod 应该如下所示 message topic subscriber updates notific
  • 即使通过 PuTTY 连接到 Windows 上的 GitHub 时也出现问题

    我知道已经在各个地方 Stack Overflow 内外 讨论了这个问题 但我还没有找到一致有效的解决方案 现在 我正在尝试通过 putty 连接到 github 我正在连接到 github com 加载我的私钥 并获得 登录为 迅速的 当
  • CSS 目标只是类名以字符串开头和结尾

    我想为我们公司创建某些标准的 css 代码 作为品牌 我想以我的公司名称开始所有类名 并以 Cls 结尾 div class Nam StdCss Cls div div class Nam StdCss Raduis Cls div di
  • 如何最小化asp.net中页面的视图状态大小?

    如何最小化asp net中页面的视图状态大小 请帮忙 您有多种选择来减少 ViewState 禁用视图状态对于不需要它的控件 这是最有效的解决方案 例如 如果您可以在服务器上缓存一些数据 那么您可以为每个请求重新绑定任何数据绑定控件 并且不
  • Flutter中main函数和runApp()函数有什么区别?

    我倾向于问这个问题 因为大多数时候我们直接调用 runApp 函数 main 而不执行其他操作 我的问题是为什么 runApp 和 main 保持不同 可能很简单 保留 main 函数或 runApp 函数 而放弃其他函数 在 Dart 中
  • 正则表达式:如果字母与数字相邻,则添加空格

    我正在使用 PHP 但不太擅长使用正则表达式 我需要一个 preg replace 如果字母或数字相邻 它可以添加空格 这些是场景 mystreet12 gt mystreet 12 mystreet 38B gt mystreet 38
  • Base10 到 Base64 网址缩短

    我正在为一个正在学习 php 的项目编写一个 url 缩短函数 这是代码 顺便说一句 我想global这不是一件好事 P alphabet array 1 gt a b c d e f g h i j k l m n o p q r s t
  • 如何在 Pygame 中按住“按键”?

    我使用 Pygame 1 9 6 和 Python 3 7 4 我想按住空格键 它会不断地一遍又一遍地执行相同的操作 我知道如何按下按钮KEYDOWN 我看了下问题 如何在 Pygame 中有效地按住键 寻求答案 但无法理解一个答案 whi
  • Delphi 编译和构建在同一项目上生成不同的二进制文件

    在新的 VCL 应用程序中Compile and Build操作生成相同的二进制文件和映射文件 即使关闭 在项目中包含版本信息 选项 exe 文件末尾也有细微差别 已经讨论过 映射文件的字节与字节相同 但是当我添加任何第三方组件时 构建和编
  • 从 ul li jquery 获取所选项目

    您好 我正在动态地在 ul li HTML 标记中填充一个列表 我所需要的只是获取相应 ul 的选定 li 的值 我尝试了所有可能的 jquery 方法 但仍然未定义 我将 ul li 填充为 jQuery get url function
  • MySQL 按 ID 和最新日期时间分组

    我在这里看到了类似的问题 但没有一个对我的情况有帮助 我有一个表可以说测试 使用 mysql MyISAM 测试具有以下架构 TID INT PRIMARY KEY AUTO INCREMENT TData varchar data tha
  • 当只有 https URL 时,获取证书并将其添加到 Java 信任库?

    我正在尝试通过 Google Cloud Message 服务器向 Android 设备发送推送通知 我们用来执行此操作的 URL 是 https android googleapis com gcm send 在我们的企业应用程序中 我们
  • Clojure 宏将保留关联映射顺序

    作为前言 我在 Windows 7 64 位 上运行 Java 版本 6 更新 33 使用clooj作为我的 IDE 我没有尝试在任何其他系统中重现我的问题 我对 Clojure 有经验 但对 Java 一点经验都没有 我试图解决的整个问题
  • Firebase 存储安全规则 400 错误问题“权限被拒绝。无法访问存储桶 xxxxx-****.appspot.com”

    尝试上传照片时 我不断从 firebase 链接收到消息错误 提示我的 React 项目中的 firebase 存储上传出现 400 错误 之前一切正常并成功上传图像 但现在它停止上传照片 出现以下错误 我不知道问题出在哪里 检查中提示出来
  • Horner 小数部分递归算法 - Java

    我正在尝试创建一个递归方法 使用 Horner 算法将以 n 为基数的小数转换为以 10 为基数的小数 我在这里和各处进行了搜索 但找不到任何详细处理小数部分的地方 需要注意的是 我在递归方面非常薄弱 因为我还没有在编程课程中正式学习它 但
  • 我需要一个 MSI 自定义操作来从 MSI 源目录复制文件

    我正在使用 VS 2008 为 c windows 项目创建一个安装程序 我正在尝试编写一个自定义操作 该操作从存储在文件服务器上的 MSI 文件的源目录复制设置文件 例如 server fileshare myappinstaller m
  • Spring REST 服务:如何配置以删除 json 响应中的空对象

    我有一个返回 json 响应的 Spring Web 服务 我使用此处给出的示例来创建服务 http www mkyong com spring mvc spring 3 mvc and json example 返回的json格式为 na