Skip to content

Instantly share code, notes, and snippets.

@govi20
Last active January 10, 2021 06:14
Show Gist options
  • Save govi20/9ff58166ae5d3d384376efc6a14c4981 to your computer and use it in GitHub Desktop.
Save govi20/9ff58166ae5d3d384376efc6a14c4981 to your computer and use it in GitHub Desktop.
Jackson Backward Compatibility while changing Array type to Object
// New Model
class Person {
private int id;
@JsonDeserialize(using = CustomDeserializer.class)
@JsonAlias("addresses")
private AddressDetails addressDetails;
public Person() {
}
public Person(int id, AddressDetails addressDetails) {
this.id = id;
this.addressDetails = addressDetails;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public AddressDetails getAddressDetails() {
return addressDetails;
}
public void setAddressDetails(AddressDetails addressDetails) {
this.addressDetails = addressDetails;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", addressDetails=" + addressDetails +
'}';
}
}
class CustomDeserializer extends JsonDeserializer<AddressDetails> {
@Override
public AddressDetails deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser);
if (jsonNode.isArray()) {
AddressDetails addressDetails = new AddressDetails();
List<AddressInfo> addressInfos = new ArrayList<>();
for (JsonNode next : jsonNode) {
AddressInfo addressInfo = getAddressInfo(next);
addressInfos.add(addressInfo);
}
addressDetails.setAddressInfos(addressInfos);
return addressDetails;
} else {
return jsonParser.getCodec().treeToValue(jsonNode, AddressDetails.class);
}
}
private AddressInfo getAddressInfo(JsonNode next) {
String addressLine1 = next.get("addressLine1").asText();
String city = next.get("city").asText();
String country = next.get("country").asText();
return new AddressInfo(addressLine1, city, country);
}
}
class AddressDetails {
private List<AddressInfo> addressInfos;
public AddressDetails() {
}
public List<AddressInfo> getAddressInfos() {
return addressInfos;
}
public void setAddressInfos(List<AddressInfo> addressInfos) {
this.addressInfos = addressInfos;
}
public AddressDetails(List<AddressInfo> addressInfos) {
this.addressInfos = addressInfos;
}
@Override
public String toString() {
return "AddressDetails{" +
"addressInfos=" + addressInfos +
'}';
}
}
class AddressInfo {
private String addressLine1;
private String city;
private String country;
public AddressInfo() {
}
public AddressInfo(String addressLine1, String city, String country) {
this.addressLine1 = addressLine1;
this.city = city;
this.country = country;
}
public String getAddressLine1() {
return addressLine1;
}
public String getCity() {
return city;
}
public String getCountry() {
return country;
}
public void setAddressLine1(String addressLine1) {
this.addressLine1 = addressLine1;
}
public void setCity(String city) {
this.city = city;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public String toString() {
return "AddressInfo{" +
"addressLine1='" + addressLine1 + '\'' +
", city='" + city + '\'' +
", country='" + country + '\'' +
'}';
}
}
// Old Model
class Person {
private int id;
private List<Address> addresses;
public Person() {
}
public Person(int id, List<Address> addresses) {
this.id = id;
this.addresses = addresses;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List<Address> getAddresses() {
return addresses;
}
public void setAddressDetails(List<Address> addresses) {
this.addresses = addresses;
}
}
class Address {
private String addressLine1;
private String city;
private String country;
public Address() {
}
public Address(String addressLine1, String city, String country) {
this.addressLine1 = addressLine1;
this.city = city;
this.country = country;
}
public String getAddressLine1() {
return addressLine1;
}
public String getCity() {
return city;
}
public String getCountry() {
return country;
}
public void setAddressLine1(String addressLine1) {
this.addressLine1 = addressLine1;
}
public void setCity(String city) {
this.city = city;
}
public void setCountry(String country) {
this.country = country;
}
}
// Below two string are created using two different models: Refer below two files to track the changes between models
String oldString = "{\"id\":1,\"addresses\":[{\"addressLine1\":\"Central Park\",\"city\":\"NYC\",\"country\":\"UK\"},{\"addressLine1\":\"Near Wembley\",\"city\":\"London\",\"country\":\"UK\"}]}";
String newString = "{\"id\":1,\"addressDetails\":{\"addressInfos\":[{\"addressLine1\":\"Central Park\",\"city\":\"London\",\"country\":\"UK\"},{\"addressLine1\":\"Near Wembley\",\"city\":\"London\",\"country\":\"UK\"}]}}";
ObjectMapper objectMapper = new ObjectMapper();
try {
Person person1 = objectMapper.readValue(oldString, Person.class);
Person person2 = objectMapper.readValue(newString, Person.class);
System.out.println(person1);
System.out.println(person2);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment