Last active
January 10, 2021 06:14
-
-
Save govi20/9ff58166ae5d3d384376efc6a14c4981 to your computer and use it in GitHub Desktop.
Jackson Backward Compatibility while changing Array type to Object
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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 + '\'' + | |
'}'; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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