Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring REST Service: how to configure to remove null objects in json response

I have a spring webservice that returns a json response. I'm using the example given here to create the service: http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/

The format the json is returned in is: {"name":null,"staffName":["kfc-kampar","smith"]}

I want to remove any null objects from the returned response so it looks like this: {"staffName":["kfc-kampar","smith"]}

I've found similar questions asked here but I've been able to get a solution working e.g.

Configuring ObjectMapper in Spring

How to configure MappingJacksonHttpMessageConverter while using spring annotation-based configuration?

configuring the jacksonObjectMapper not working in spring mvc 3

how to configure spring mvc 3 to not return "null" object in json response?

Spring configure @ResponseBody JSON format

Jackson+Spring3.0.5 custom object mapper

From reading through these and other sources, I figured the cleanest way to achieve what I wanted was to use Spring 3.1 and the message-converters that can be configured within the mvc-annotation. My updated spring config file is:

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

The service class is the same as given on the mkyong.com site, except I commented out the setting of the Shop name variable so it's null i.e.

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

The Jackson jars I'm using are jackson-mapper-asl 1.9.0 and jackson-core-asl 1.9.0. These are the only new jars I've added to the pom as provided as part of the spring-json project I downloaded from mkyong.com.

The project builds successfully, but when I invoke the service through the browser I still get the same thing i.e. {"name":null,"staffName":["kfc-kampar","smith"]}

Can anyone tell me where I'm going wrong with my configuration?

I've tried several other options, but the only way I've been able to return the json in the correct format is to add the Object mapper to the JSONController and have the "getShopInJSON" method return a string i.e.

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

Now if I invoke the service I get the expected i.e. {"staffName":["kfc-kampar","cronin"]}

I've also been able to get it to work using the @JsonIgnore annotation, but this solution isn't suitable for me.

I don't understand why it's working in code but not in the configuration, so any help would be fantastic.

like image 835
mikec Avatar asked Oct 03 '12 11:10

mikec


People also ask

How do I ignore null values in JSON response spring rest?

You can ignore null fields at the class level by using @JsonInclude(Include. NON_NULL) to only include non-null fields, thus excluding any attribute whose value is null. You can also use the same annotation at the field level to instruct Jackson to ignore that field while converting Java object to json if it's null.

How do I ignore null values in post request body in spring boot?

Just use this @JsonSerialize(include = Inclusion. NON_NULL) instead of @JsonInclude(Include. NON_NULL) and it works..!!

How do I ignore a field in JSON request?

The Jackson @JsonIgnore annotation can be used to ignore a certain property or field of a Java object. The property can be ignored both when reading JSON into Java objects and when writing Java objects into JSON.


1 Answers

Since Jackson 2.0 you can use JsonInclude

@JsonInclude(Include.NON_NULL) public class Shop {     //... } 
like image 197
Walery Strauch Avatar answered Sep 24 '22 03:09

Walery Strauch