Jackson @JsonView does not work as expected

I am using Jackson JSON 1.9.12 with SpringMVC. I created dto with JSON fields. I want two profiles of the same dto with different JSON fields, so I created two interfaces and I have annotated fields with @JsonView annotation.

 class Views { static class Public {} static class ExtendedPublic {} ... } public class Thing { @JsonView(Views.Public.class) Integer id; @JsonView(Views.ExtendPublic.class) String name; } 

In the controller

 @RequestMapping(value = "/thing/{id}") public void getThing(@PathVariable final String id, HttpServletResponse response) { Thing thing = new Thing(); ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writerWithView(Views.Public.class).writeValueAsString(thing); LOG.debug("JSON: {}", json); } 

I expect JSON to only contain the id field, but always contains all the fields.

Any ideas?

+4
source share
1 answer

The following code is tested using Spring 3.2.0 and Jackson 1.9.12, which simply returns {id: 1} rather than the extended {name: "name"} , as it uses .writerWithView (Views.Public.class). Going to Views.ExtendPublic.class will result in {"id":1,"name":"name"}

Edit: Adding all project files for a complete solution, which makes this answer better than my other, on Using @JsonView with Spring MVC

DemoController.java

 package com.demo.app; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.codehaus.jackson.map.annotate.JsonView; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.ObjectWriter; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Controller public class DemoController { private final ObjectMapper objectMapper = new ObjectMapper(); @RequestMapping(value="/jsonOutput") @ResponseBody public String myObject(HttpServletResponse response) throws IOException { ObjectWriter objectWriter = objectMapper.writerWithView(Views.Public.class); return objectWriter.writeValueAsString(new MyObject()); } public static class Views { static class Public {} static class ExtendPublic extends Public {} } public class MyObject { @JsonView(Views.Public.class) Integer id = 1; @JsonView(Views.ExtendPublic.class) String name = "name"; } } 

web.xml

 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"/> 

Initializer.java

 package com.demo.app.spring; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.*; public class Initializer implements WebApplicationInitializer { public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext mvcContext = new AnnotationConfigWebApplicationContext(); mvcContext.register(AppConfig.class); ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(mvcContext)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/*"); } } 

Appconfig.java

 package com.demo.app.spring; import org.springframework.context.annotation.*; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration @EnableWebMvc @ComponentScan(basePackages="com.demo.app") public class AppConfig { } 

pom.xml

 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.demo</groupId> <artifactId>app</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>war</packaging> <name>${project.artifactId}</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>3.2.0.RELEASE</spring.version> <jetty.plugin.version>8.1.7.v20120910</jetty.plugin.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.12</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.12</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>${jetty.plugin.version}</version> <configuration> <webApp> <contextPath>/</contextPath> </webApp> </configuration> </plugin> </plugins> </build> </project> 

In the following structure:

 pom.xml src |- main |- java | |- com | |- demo | |- app | |- controller/DemoController.java | |- spring/AppConfig.java, Initializer.java |- webapp |- WEB-INF/web.xml 
+1
source

All Articles