使用 POJO 字段名将 POJO 转换为 JsonNode

convert POJO to JsonNode with POJO fieldnames

要求:

  1. 将 json 文件中的选定字段收集到 POJO(字段名称不匹配)
  2. 更新 POJO 的其他非映射字段
  3. 转换回 json具有 POJO 字段名的节点

问题: 步骤 1 和 2 没问题。将 POJO 转换回 JsonNode 时,我无法在 POJO 字段名称中获取它。任何人都可以建议一种方法吗?

下面是我的代码

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyPOJO {

@JsonProperty("Firstname")
private String name;

@JsonProperty("Country")
private String nationality;

private String state;

//getters and setters
}

逻辑

     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 文件

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

输出:

    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"}

预期输出

    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"}

解决办法是把@JsonProperty放在getter和setter上,用不同的值,比如:

[…]
private String nationality;

@JsonProperty("nationality")
public String getNationality() {
    return nationality;
}

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

getter执行序列化,setter反序列化。