I don't understand what is Jackson's @JsonView(Views.MyClass.class). I know that I can annotate POJO's fields and methods in this way to filter non-annotated ones from being serialized with JSON. But what is the Views.Myclass class? Is it a template class for Jackson library?
And why can there be many classes inside the Views class? For example like this:
class Views {
static class Public { }
static class ExtendedPublic extends PublicView { }
static class Internal extends ExtendedPublicView { }
}
Why is it needed and how does it work?
The JsonView annotation can be used to include/exclude a property during the serialization and deserialization process dynamically. We need to configure an ObjectMapper class to include the type of view used for writing a JSON from Java object using the writerWithView() method.
The Jackson ObjectMapper can parse JSON from a string, stream or file, and create a Java object or object graph representing the parsed JSON. Parsing JSON into Java objects is also referred to as to deserialize Java objects from JSON. The Jackson ObjectMapper can also create JSON from Java objects.
The @JsonProperty annotation is used to map property names with JSON keys during serialization and deserialization. By default, if you try to serialize a POJO, the generated JSON will have keys mapped to the fields of the POJO.
Class ObjectMapper. ObjectMapper provides functionality for reading and writing JSON, either to and from basic POJOs (Plain Old Java Objects), or to and from a general-purpose JSON Tree Model ( JsonNode ), as well as related functionality for performing conversions.
Use @JsonView
to filter fields depending on the context of serialization. When returning data to a REST client, depending on which REST service was called, we need to limit which data will be serialized while using the same data model.
Lets say we want to create two REST services:
The first service returns some user information like first name and last name but not the messages attached to it.
The second service returns all information from the first service and also the messages attached to the current user.
Sample POJO classes with @JsonView
annotation
@JsonView(User.Views.Public.class)
public String getFirstname() {
return firstname;
}
@JsonView(User.Views.Public.class)
public String getLastname() {
return lastname;
}
@JsonView(User.Views.Internal.class)
public List<Message> getMessages() {
return messages;
}
@RestController
public class SimpleRestController {
@Autowired
SimpleService simpleService;
@RequestMapping(value = "/user/public", method = RequestMethod.GET)
@JsonView(User.Views.Public.class)
public User getUserWithPublicData() {
return simpleService.loadUser();
}
@RequestMapping(value = "/user/internal", method = RequestMethod.GET)
@JsonView(User.Views.Internal.class)
public User getUserWithInternalData() {
return simpleService.loadUser();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With