使用json配置通过自定义转换器将POJO转换为POJO

时间:2019-07-23 19:36:53

标签: java jackson pojo dozer mapper

我们有两个Pojo文件。

Person {
  String name;
  int age;
  String address;
  String phoneNo;
  boolean isMarried;
}

 OtherPerson {
//mandatory fields are name and age
  String name_other;
  int age_other;
//other fields
  Map<String, Object> otherFields;
}

和一个使用名称定义字段之间映射的json文件

mappingJson {
 "name":"name_other",
 "age":"age_other",
 "address":"address_other",
 "phoneNo":"phoneno_other",
 "isMarried":"ismarried_other"
}

请让我知道将Person转换为OtherPerson的最佳方法。这样,必填字段可以映射到name_other和age_other,而其他字段应添加到map(otherFields)

可能是

Person-> Person(json)-> OtherPerson

Or Person-> OtherPerson。

编辑: “用例:我们有一个用于接受POJO'A'的API,但现在它需要接受POJO'B'作为输入参数。此POJO需要转换为POJO'A',然后可用于持久化进入数据库。POJO'B'也不受我们的控制”

2 个答案:

答案 0 :(得分:0)

我个人不需要JSON就可以做到这一点。据我了解,Map中的某些字段是可选的,而名称和年龄是必填的。对于可选内容,我将使用Ternary运算符创建person对象。如果可选字段不可用,这使您可以添加一些默认值。

  

主要

import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author blj0011
 */
public class JavaApplication30 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Map<String, Object> map1 = new HashMap();
        map1.put("address", "123 Hello Street");
        map1.put("phoneNo", "555-555-5555");
        map1.put("isMarried", true);
        OtherPerson otherPerson = new OtherPerson("John Doe", 22, map1);

        Map<String, Object> map2 = new HashMap();
        map2.put("address", "4456 Bye Road");
        map2.put("isMarried", false);
        OtherPerson otherPerson2 = new OtherPerson("Jane Doe", 21, map2);


        Person person1 = new Person(otherPerson.getName_other(), otherPerson.getAge_other(), 
                otherPerson.getOtherFields().containsKey("address") ? otherPerson.getOtherFields().get("address").toString(): "", 
                otherPerson.getOtherFields().containsKey("phoneNo") ? otherPerson.getOtherFields().get("phoneNo").toString(): "",
                otherPerson.getOtherFields().containsKey("isMarried") ? Boolean.valueOf(otherPerson.getOtherFields().get("isMarried").toString()): false);

        System.out.println(person1);

        Person person2 = new Person(otherPerson2.getName_other(), otherPerson2.getAge_other(), 
                otherPerson2.getOtherFields().containsKey("address") ? otherPerson2.getOtherFields().get("address").toString(): "", 
                otherPerson2.getOtherFields().containsKey("phoneNo") ? otherPerson2.getOtherFields().get("phoneNo").toString(): "",
                otherPerson2.getOtherFields().containsKey("isMarried") ? Boolean.valueOf(otherPerson2.getOtherFields().get("isMarried").toString()): false);

        System.out.println(person2);
    }    
}
  

/**
 *
 * @author blj0011
 */
public class Person {
    private String name;
    private int age;
    private String address;
    private String phoneNo;
    private boolean isMarried;

    public Person(String name, int age, String address, String phoneNo, boolean isMarried) {
        this.name = name;
        this.age = age;
        this.address = address;
        this.phoneNo = phoneNo;
        this.isMarried = isMarried;
    }

    public boolean isIsMarried() {
        return isMarried;
    }

    public void setIsMarried(boolean isMarried) {
        this.isMarried = isMarried;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhoneNo() {
        return phoneNo;
    }

    public void setPhoneNo(String phoneNo) {
        this.phoneNo = phoneNo;
    }

    @Override
    public String toString() {
        return "Person{" + "name=" + name + ", age=" + age + ", address=" + address + ", phoneNo=" + phoneNo + ", isMarried=" + isMarried + '}';
    }    
}
  

OtherPerson

/**
 *
 * @author blj0011
 */
public class OtherPerson {
    //mandatory fields are name and age
     private String name_other;
    private int age_other;
    //other fields
    private Map<String, Object> otherFields;

    public OtherPerson(String name_other, int age_other, Map<String, Object> otherFields) {
        this.name_other = name_other;
        this.age_other = age_other;
        this.otherFields = otherFields;
    }

    public Map<String, Object> getOtherFields() {
        return otherFields;
    }

    public void setOtherFields(Map<String, Object> otherFields) {
        this.otherFields = otherFields;
    }

    public String getName_other() {
        return name_other;
    }

    public void setName_other(String name_other) {
        this.name_other = name_other;
    }

    public int getAge_other() {
        return age_other;
    }

    public void setAge_other(int age_other) {
        this.age_other = age_other;
    }
}
  

输出

Person{name=John Doe, age=22, address=123 Hello Street, phoneNo=555-555-5555, isMarried=true}
Person{name=Jane Doe, age=21, address=4456 Bye Road, phoneNo=, isMarried=false}

正如您在输出中看到的,OtherPerson2没有电话号码。空字符串用作默认值。

答案 1 :(得分:0)

这是Jackson Converter的完美选择! :) 它可以像这样工作:

class OtherPerson {
    @JsonProperty("name")
    public String name_other;
    @JsonProperty("age")
    public int age_other;

    Map<String, Object> otherFields = new LinkedHashMap<>();;

    @JsonAnySetter
    public void add(String key, Object value) {
        otherFields.put(key, value);
    }
}
// ...

Person person = new Person();
person.name = "Avinash";
person.age = 25;
person.address = "Mumbai";
person.phoneNo = "910731";
person.isMarried = true; // :( sorry ladies!

// ...

ObjectMapper mapper = new ObjectMapper();

// If we cannot put @JsonAutoDetect on top of Person.class,
// we need to add handling of non-public fields
// since Person seems to neither have public fields nor setters
mapper.configOverride(Person.class)
        .setVisibility(JsonAutoDetect.Value.defaultVisibility()
                .withFieldVisibility(JsonAutoDetect.Visibility.NON_PRIVATE));

OtherPerson other = mapper.convertValue(person, OtherPerson.class);

Voilà!