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

Spring REST Service:如何配置为在JSON响应中删除空对象

公孙智
2023-03-14
问题内容

通过阅读这些和其他资料,我发现实现我想要的最干净的方法是使用Spring 3.1和可以在mvc-annotation中配置的消息转换器。我更新的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网站上提供的服务类相同,只不过我注释掉了商店名称变量的设置,因此它为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;
    }
}

我正在使用的Jacksonjar是jackson-mapper-asl 1.9.0和jackson-core-asl 1.9.0。这些是我从mkyong.com下载的spring-json项目的一部分,是我添加到pom中的唯一新罐。

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

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

我尝试了其他几种选择,但是我能够以正确格式返回json的唯一方法是将Object映射器添加到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开始,你可以使用JsonInclude

@JsonInclude(Include.NON_NULL)
public class Shop {
    //...
}


 类似资料:
  • 我有一个返回json响应的spring webservice。我使用这里给出的示例创建服务:http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/ 返回json的格式为:{“name”:null,“staffname”:[“kfc-kampar”,“smith”]} 我想从返回的响应中删除任何空对象,因此它看起来如下所示:{“

  • 问题内容: 在.NET Core 1.0(所有API响应)的全局级别上,如何配置Startup.cs,以便在JSON响应中删除/忽略空字段? 使用Newtonsoft.Json,您可以将以下属性应用于属性,但我希望避免将其添加到每个属性中: 问题答案: [.NET Core 1.0] 在Startup.cs中,可以将JsonOptions附加到服务集合,并在其中设置各种配置,包括删除空值: [.N

  • 下面是一个json响应的示例。正如您所看到的,像:news、number_likes、number_comment、number_post、user和owner这样的字段总是存在。但是像:place、place_mark、comment、album、photo这样的字段并不总是存在。这取决于新闻的类型。 请帮帮我!为了正确的json反序列化,我需要做什么?也许有人有经验,在编写自定义转炉工厂或可以

  • 如何从Jackson在中生成的json响应中排除所有空json对象、数组或空对象的数组? 我正在为一个客户端构建一个Spring Boot REST API。API向数据库发送请求,并且必须生成JSON响应。 DAO层发送本机SQL查询,并以列表形式接收巨大的DB结果。开发人员必须使用索引手动将此结果映射到Java对象(参见下面的代码) SQL查询返回大量空值(这些查询不能修改)。由于这些空值,只

  • 我有简单的asmx返回JSON: C#类定义: 使用jquery$调用。ajax: 我的JSON响应(带有不需要的空值): {“PropertyA”:“1”,“PropertyB”:null,“PropertyC”:“1”,“PropertyD”:null} 问:如何仅使用JSON中的非空属性,尽可能多地使用我已经拥有的内容? 我在这里看到了一些答案,人们返回JSON对象和用JSON属性定义的属性

  • 我想删除MVC中的http响应头。 HTTP/1.1 404找不到缓存-控件:私有内容-类型:text/html;charst=UTF-8服务器:Microsoft-IIS/8.0X-Powered-by:ASP.NET日期:Mon,23 Feb 2015 12:43:58 GMT内容-长度:4898连接:Keep-Alive 我使用以下代码删除连接、X-Powered-By、Server、Cac