Search code examples
javajsonjacksonpojojackson-databind

convert POJO to JsonNode with POJO fieldnames


Requirement:

  1. collect selected fields from a json file into a POJO(field names do not match)
  2. update other non-mapped fields of POJO
  3. convert back to jsonNode with POJO fieldnames

Problem: steps 1 and 2 are fine. When converting POJO back to JsonNode I am unable to get it in POJO field names. Can anyone suggest a way to get this?

below is my code

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyPOJO {

@JsonProperty("Firstname")
private String name;

@JsonProperty("Country")
private String nationality;

private String state;

//getters and setters
}

logic

     ObjectMapper map = new ObjectMapper();
    JsonNode root =map.readTree(new Main().getResorceFile());
    List<MyPOJO> myList = new ArrayList<MyPOJO>();

    for(JsonNode each : root){
        MyPOJO myPOJO = new MyPOJO();
        myPOJO= map.readValue(each.toString(),MyPOJO.class);
        System.out.println(myPOJO.toString());
        myList.add(myPOJO);
    }
    for(MyPOJO p : myList){
        JsonNode node = map.convertValue(p,JsonNode.class);
        System.out.println((node.toString()));
    }

Json file

    {
        {
            "Firstname":"Tez",
            "Lastname":"Morris",
            "Country":"US"
        },
        {
            "Firstname":"Kip",
            "Lastname":"Lee",
            "Country":"US"
        },
        {
            "Firstname":"Pam",
            "Lastname":"Carr",
            "Country":"US"
        },
        {
            "Firstname":"lin",
            "Lastname":"Dale",
            "Country":"US"
        }
    }

output:

    Main{name='Tez', nationality='US', state='null'}
    Main{name='Kip', nationality='US', state='null'}
    Main{name='Pam', nationality='US', state='null'}
    Main{name='lin', nationality='US', state='null'}
    {"state":null,"Firstname":"Tez","Country":"US"}
    {"state":null,"Firstname":"Kip","Country":"US"}
    {"state":null,"Firstname":"Pam","Country":"US"}
    {"state":null,"Firstname":"lin","Country":"US"}

expected output

    Main{name='Tez', nationality='US', state='null'}
    Main{name='Kip', nationality='US', state='null'}
    Main{name='Pam', nationality='US', state='null'}
    Main{name='lin', nationality='US', state='null'}
    {"state":null,"name":"Tez","nationality":"US"}
    {"state":null,"name":"Kip","nationality":"US"}
    {"state":null,"name":"Pam","nationality":"US"}
    {"state":null,"name":"lin","nationality":"US"}

Solution

  • The solution is to put the @JsonProperty on getters and setters with different values, like:

    […]
    private String nationality;
    
    @JsonProperty("nationality")
    public String getNationality() {
        return nationality;
    }
    
    @JsonProperty("Country")
    public void setNationality(String nationality) {
        this.nationality = nationality;
    }
    […]
    

    The getter performs serialization, the setter deserialization.