Using @JsonSerialize annotation,
you can specify custom serializer for a model class and @JsonDeserialize
annotation used to specify custom deserializer.
Step 1: Define serializer by extending JsonSerializer
class.
public class AddressSerializer extends JsonSerializer<Address> {
@Override
public void serialize(Address address, JsonGenerator gen, SerializerProvider serializers)
throws IOException, JsonProcessingException {
gen.writeStartObject();
gen.writeStringField("address", getCommmaSeparatedAddress(address));
gen.writeEndObject();
}
private static String getCommmaSeparatedAddress(Address address) {
StringBuilder builder = new StringBuilder();
builder.append(address.getStreet()).append(",").append(address.getCity()).append(",")
.append(address.getCountry());
return builder.toString();
}
}
Step 2: Define deserializer by extending JsonDeserializer
class.
public class AddressDeserializer extends JsonDeserializer<Address> {
@Override
public Address deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
TreeNode node = jp.getCodec().readTree(jp);
String addressStr = node.get("address").toString();
return getAddress(addressStr);
}
private static Address getAddress(String addr) {
Address address = new Address();
String[] tokens = addr.split(",");
address.setStreet(tokens[0]);
address.setCity(tokens[1]);
address.setCountry(tokens[2]);
return address;
}
}
Step 3: Specify serializer using @JsonSerialize annotation
and deserializer using @JsonDeserialize annotation.
@JsonDeserialize(using = AddressDeserializer.class)
@JsonSerialize(using = AddressSerializer.class)
public class Address {
.....
.....
}
Find the below working
application.
package com.sample.app.model;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.sample.app.serializer.AddressDeserializer;
import com.sample.app.serializer.AddressSerializer;
@JsonDeserialize(using = AddressDeserializer.class)
@JsonSerialize(using = AddressSerializer.class)
public class Address {
private String street;
private String city;
private String country;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Address [street=");
builder.append(street);
builder.append(", city=");
builder.append(city);
builder.append(", country=");
builder.append(country);
builder.append("]");
return builder.toString();
}
}
Employee.java
package com.sample.app.model;
public class Employee {
private String firstName;
private String lastName;
private Address address;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Employee [firstName=");
builder.append(firstName);
builder.append(", lastName=");
builder.append(lastName);
builder.append(", address=");
builder.append(address);
builder.append("]");
return builder.toString();
}
}
AddressSerializer.java
package com.sample.app.serializer;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.sample.app.model.Address;
public class AddressSerializer extends JsonSerializer<Address> {
@Override
public void serialize(Address address, JsonGenerator gen, SerializerProvider serializers)
throws IOException, JsonProcessingException {
gen.writeStartObject();
gen.writeStringField("address", getCommmaSeparatedAddress(address));
gen.writeEndObject();
}
private static String getCommmaSeparatedAddress(Address address) {
StringBuilder builder = new StringBuilder();
builder.append(address.getStreet()).append(",").append(address.getCity()).append(",")
.append(address.getCountry());
return builder.toString();
}
}
AddressDeserializer.java
package com.sample.app.serializer;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.TreeNode;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.sample.app.model.Address;
public class AddressDeserializer extends JsonDeserializer<Address> {
@Override
public Address deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
TreeNode node = jp.getCodec().readTree(jp);
String addressStr = node.get("address").toString();
return getAddress(addressStr);
}
private static Address getAddress(String addr) {
Address address = new Address();
String[] tokens = addr.split(",");
address.setStreet(tokens[0]);
address.setCity(tokens[1]);
address.setCountry(tokens[2]);
return address;
}
}
App.java
package com.sample.app;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sample.app.model.Address;
import com.sample.app.model.Employee;
public class App {
public static void main(String args[]) throws JsonParseException, JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
Address address = new Address();
address.setCity("Bangalore");
address.setStreet("Chowdeswari Street");
address.setCountry("India");
Employee emp = new Employee();
emp.setFirstName("Rama Krishna");
emp.setLastName("Gurram");
emp.setAddress(address);
String json = mapper.writeValueAsString(emp);
Employee emp1 = mapper.readValue(json, Employee.class);
System.out.println("Serialized Data : \n" + json);
System.out.println("\nDeserialized Data : \n" + emp1);
}
}
Run App.java, you will see
below messages in console.
Serialized Data : {"firstName":"Rama Krishna","lastName":"Gurram","address":{"address":"Chowdeswari Street,Bangalore,India"}} Deserialized Data : Employee [firstName=Rama Krishna, lastName=Gurram, address=Address [street="Chowdeswari Street, city=Bangalore, country=India"]]
No comments:
Post a Comment