@JsonView
es already supported en el procesador Jackson JSON de v1.4 en adelante.
Nueva edición: Actualización para Jackson 1.9.12
De acuerdo con la v1.8.4 documentation la función que estaba usando writeValueUsingView
está ahora DesfasadaUso ObjectMapper.viewWriter (java.lang.Class) en lugar & hellip; sin embargo, también ha sido DeprecatedDesde 1.9, use writerWithView (Class) en su lugar! (Ver v1.9.9 documentation)
Así que aquí es un ejemplo actualizado, probado con Spring 3.2.0 y 1.9.12 Jackson, que simplemente devuelve {id: 1}
y no extendida {name: "name"}
ya que está utilizando el .writerWithView(Views.Public.class)
. El cambio a Views.ExtendPublic.class
dará lugar a {"id":1,"name":"name"}
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";
}
}
Edición Anterior: Es necesario crear una instancia del ObjectMapper
y escribir el objeto con una vista personalizada como se muestra here, o en este ejemplo:
Definir puntos de vista:
class Views {
static class Public {}
static class ExtendedPublic extends PublicView {}
...
}
public class Thing {
@JsonView(Views.Public.class) Integer id;
@JsonView(Views.ExtendPublic.class) String name;
}
Use vistas:
private final ObjectMapper objectMapper = new ObjectMapper();
@RequestMapping(value = "/thing/{id}")
public void getThing(@PathVariable final String id, HttpServletResponse response) {
Thing thing = new Thing();
objectMapper.writeValueUsingView(response.getWriter(), thing, Views.ExtendPublic.class);
}
Si está usando Jackson> = 1.7 puede encontrar que el @JSONFilter
se adapta mejor a sus necesidades.
solo para su información, finalmente terminé escribiendo mi propia opinión – Erik