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

我有一个返回json响应的spring webservice。 我使用这里给出的例子来创build服务: http : //www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/

json返回的格式是:{“name”:null,“staffName”:[“kfc-kampar”,“smith”]}

我想从返回的响应中删除任何空对象,如下所示:{“staffName”:[“kfc-kampar”,“smith”]}

我在这里发现类似的问题,但我已经能够得到一个解决scheme,例如

在Spring中configurationObjectMapper

如何在使用基于Spring注解的configuration时configurationMappingJacksonHttpMessageConverter?

configurationjacksonObjectMapper不工作在springmvc 3

如何configurationspring mvc 3不返回json响应中的“null”对象?

Springconfiguration@ResponseBody JSON格式

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

从阅读这些和其他来源,我想到了最简洁的方法来实现我想要的是使用Spring 3.1和可以在mvc注释中configuration的消息转换器。 我更新的springconfiguration文件是:

<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 namevariables的设置,所以它是空的

 @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项目中添加的唯一一个新的jar。

项目build立成功,但是当我通过浏览器调用服务时,我仍然得到同样的东西,即{“名称”:null,“staffName”:[“kfc-kampar”,“smith”]}

任何人都可以告诉我哪里我错了我的configuration?

我已经尝试了几个其他的select,但唯一能够以正确的格式返回json的方法是将Object映射器添加到JSONController,并使“getShopInJSON”方法返回一个string,即

 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; } 

现在,如果我调用服务,我得到预期的ie {“staffName”:[“kfc-kampar”,“cronin”]}

我也已经能够使用@JsonIgnore注解,但这个解决scheme不适合我。

我不明白为什么它在代码中工作,而不是在configuration中,所以任何帮助将是太棒了。

由于jackson2.0可以使用JsonInclude

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

由于jackson正在使用,你必须configuration为jackson的财产。 在Spring Boot REST服务的情况下,你必须在application.propertiesconfiguration它:

 spring.jackson.default-property-inclusion=NON_NULL 

资源

如果您使用的是Jackson 2,那么message-converters标签是:

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

从Jackson 2.0开始, @JsonSerialize(include = xxx)已被弃用@JsonInclude

对于你所有的非XMLconfiguration人员:

 ObjectMapper objMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL); HttpMessageConverter msgConverter = new MappingJackson2HttpMessageConverter(objMapper); restTemplate.setMessageConverters(Collections.singletonList(msgConverter)); 

自1.6版以来,我们有了新的注释JsonSerialize(例如版本1.9.9)。

例:

 @JsonSerialize(include=Inclusion.NON_NULL) public class Test{ ... } 

默认值是ALWAYS。

在旧版本中,您可以使用JsonWriteNullProperties,这在新版本中已弃用。 例:

 @JsonWriteNullProperties(false) public class Test{ ... } 
 @JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY) public class Shop { //... } 

这将删除空对象和空对象

我已经通过configurationSpring容器find了一个解决scheme,但它仍然不是我想要的。

我回滚到Spring 3.0.5,删除,并在它的地方,我改变我的configuration文件:

  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="objectMapper" ref="jacksonObjectMapper" /> </bean> </list> </property> </bean> <bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" /> <bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig" factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" /> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject" ref="jacksonSerializationConfig" /> <property name="targetMethod" value="setSerializationInclusion" /> <property name="arguments"> <list> <value type="org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion">NON_NULL</value> </list> </property> </bean> 

这当然与其他问题中的回答相似

configurationjacksonObjectMapper不工作在springmvc 3

重要的是要注意的是,mvc:annotation-driven和AnnotationMethodHandlerAdapter不能在相同的上下文中使用。

我仍然无法使用Spring 3.1和mvc:注解驱动。 一个使用mvc:注解驱动的解决scheme,以及与之相关的所有好处,我认为会好得多。 如果有人能告诉我如何做到这一点,那就太好了。

您可以使用JsonWriteNullProperties更旧版本的Jackson。

对于jackson1.9+,使用JsonSerialize.include