@JsonView
уже поддерживается в процессоре Jackson JSON начиная с версии 1.4.
Новое редактирование: Обновлено для Джексона 1.9.12
В соответствии с v1.8.4 документацией функция, которую я использовал writeValueUsingView
, теперь устарела Вместо этого используйте ObjectMapper.viewWriter (java.lang.Class) & hellip; однако это также было устарело Начиная с версии 1.9, используйте writerWithView (Class) вместо ! (см. v1.9.9 документация )
Итак, вот обновленный пример, протестированный с Spring 3.2.0 и Jackson 1.9.12, который просто возвращает {id: 1}
, а не расширенный {name: "name"}
, поскольку он использует .writerWithView(Views.Public.class)
. Переключение на Views.ExtendPublic.class
приведет к {"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";
}
}
Предыдущее редактирование: Вам нужно создать экземпляр ObjectMapper
и выписать объект, используя пользовательское представление, как показано здесь , или в этом примере:
Определить виды:
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;
}
Использовать просмотры:
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);
}
Если вы используете Джексона> = 1.7, вы можете обнаружить, что @JSONFilter
лучше соответствует вашим потребностям.