Java 如何声明泛型类-jackson yaml反序列化器

Java 如何声明泛型类-jackson yaml反序列化器,java,jackson,yaml,Java,Jackson,Yaml,将问题简化为只关注与问题相关的部分 我的程序有两类-联系人,电话号码 联系人有常用字段-姓名、公司等,电话号码也有诸如电话号码、类型等字段。两者都有常用的获取/设置方法 Contact类有一个addPhoneNumber方法,用于将电话号码添加到phoneNumber ArrayList,因此它缺少相应的set方法 联系人包括电话号码的ArrayList,我的程序包含联系人的ArrayList 我将Jackson解析器与Snakeyaml一起使用 packagetestyaml; 导入jav

将问题简化为只关注与问题相关的部分

  • 我的程序有两类-联系人,电话号码
  • 联系人有常用字段-姓名、公司等,电话号码也有诸如电话号码、类型等字段。两者都有常用的获取/设置方法
  • Contact类有一个addPhoneNumber方法,用于将电话号码添加到phoneNumber ArrayList,因此它缺少相应的set方法
  • 联系人包括电话号码的ArrayList,我的程序包含联系人的ArrayList
  • 我将Jackson解析器与Snakeyaml一起使用
packagetestyaml;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.util.ArrayList;
导入java.util.List;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
公共类testYaml{
公共静态void main(字符串[]args){
//定义我们的数组
列表联系人=新建ArrayList();
接触;
电话号码;
//联系人1
触点=新触点();
联系人:setName(“John Johny”);
联系人:setCompany(“ABC公司”);
联系人:设置优先级(1);
phoneNumber=新的phoneNumber();
电话号码。设置号码(“+111111”);
电话号码。设置类型(“主页”);
联系人:addNumber(电话号码);
电话号码。设置号码(“+222222”);
电话号码。设置类型(“工作”);
联系人:addNumber(电话号码);
联系人。添加(联系人);
//联系人2
触点=新触点();
联系人:setName(“Janes Bond”);
联系公司(“X部门”);
联系人:设置优先级(3);
phoneNumber=新的phoneNumber();
电话号码。设置号码(“+007007”);
电话号码。设置类型(“机密”);
联系人:addNumber(电话号码);
联系人。添加(联系人);
//联系人3
触点=新触点();
联系人:setName(“绅士”);
联系人:setCompany(“XYZ公司”);
联系人:设置优先级(1);
phoneNumber=新的phoneNumber();
电话号码。设置号码(“+111222”);
电话号码。设置类型(“手机”);
联系人:addNumber(电话号码);
phoneNumber=新的phoneNumber();
电话号码。设置号码(“+222111”);
电话号码。设置类型(“工作”);
联系人:addNumber(电话号码);
联系人。添加(联系人);
//写入yaml文件
ObjectMapper yamlMapper=newObjectMapper(new YAMLFactory());
试一试{
yamlapper.writeValue(新文件输出流(“C:/Temp/contacts.yaml”),contacts);
}捕获(例外e){
e、 printStackTrace();
}
//读取yamlFIle并填充联系人
列表联系人1=新的ArrayList();
List contacts2=new ArrayList();
ObjectMapper yamlMapper1=新的ObjectMapper(新的YAMLFactory());
试一试{
contacts1=yamlapper1.readValue(新文件InputStream(“C:/Temp/contacts.yaml”),
(Class)contacts1.getClass());
contacts2=yamlapper1.readValue(新文件inputstream(“C:/Temp/contacts.yaml”),contacts2.getClass();
}捕获(例外e){
e、 printStackTrace();
}
系统输出打印项次(“完成”);
}
}
班级联系{
字符串名;
弦乐公司;
int优先级;
ArrayList编号=新的ArrayList();
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getCompany(){
返回公司;
}
上市公司(字符串公司){
这个公司=公司;
}
public int getPriority(){
返回优先级;
}
公共无效设置优先级(整数优先级){
优先权=优先权;
}
公共阵列列表getNumbers(){
返回号码;
}
公共无效地址号码(电话号码){
数字。添加(数字);
}
}
类电话号码{
字符串编号;
字符串类型;
公共字符串getNumber(){
返回号码;
}
公共无效集合号(字符串号){
这个数字=数字;
}
公共字符串getType(){
返回类型;
}
公共void集合类型(字符串类型){
this.type=type;
}
}
contacts1和contacts2都是LinkedHashMap的数组,而不是Contact type的数组

更新-工作代码 这就是最终有效的方法(将ArrayList封装在一个新的类Contacts中。但不知道这是否是最佳解决方案

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;

public class testYaml {
    public static void main(String[] args) {
        // Define our array
        Contacts contacts = new Contacts();
        Contact contact;
        PhoneNumber phoneNumber;
        // Contact 1
        contact = new Contact();
        contact.setName("John Johny");
        contact.setCompany("ABC Corp");
        contact.setPriority(1);
        phoneNumber = new PhoneNumber();
        phoneNumber.setNumber("+111111");
        phoneNumber.setType("home");
        contact.addNumber(phoneNumber);
        phoneNumber.setNumber("+222222");
        phoneNumber.setType("work");
        contact.addNumber(phoneNumber);
        contacts.addContact(contact);
        // Contact 2
        contact = new Contact();
        contact.setName("Janes Bond");
        contact.setCompany("Dept X");
        contact.setPriority(3);
        phoneNumber = new PhoneNumber();
        phoneNumber.setNumber("+007007");
        phoneNumber.setType("secret");
        contact.addNumber(phoneNumber);
        contacts.addContact(contact);
        // Contact 3
        contact = new Contact();
        contact.setName("The Gentelman");
        contact.setCompany("XYZ Corp");
        contact.setPriority(1);
        phoneNumber = new PhoneNumber();
        phoneNumber.setNumber("+111222");
        phoneNumber.setType("mobile");
        contact.addNumber(phoneNumber);
        phoneNumber = new PhoneNumber();
        phoneNumber.setNumber("+222111");
        phoneNumber.setType("work");
        contact.addNumber(phoneNumber);
        contacts.addContact(contact);
        // Write yaml file
        ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory());
        try {
            yamlMapper.writeValue(new FileOutputStream("C:/Temp/contacts.yaml"),contacts);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // Read yamlFIle and populate contacts
        Contacts contacts1 = new Contacts();
        ObjectMapper yamlMapper1 = new ObjectMapper(new YAMLFactory());
        try {
            contacts1 = yamlMapper1.readValue(new FileInputStream("C:/Temp/contacts.yaml"),Contacts.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Contacts {
    private ArrayList<Contact> contacts = new ArrayList<Contact>();
    public void addContact (Contact contact) {
        contacts.add(contact);
    }
    public ArrayList<Contact> getContacts() {
        return contacts;
    }
}

class Contact {
    private String name;
    private String company;
    private int priority;
    private ArrayList<PhoneNumber> numbers = new ArrayList<PhoneNumber>();
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCompany() {
        return company;
    }
    public void setCompany(String company) {
        this.company = company;
    }
    public int getPriority() {
        return priority;
    }
    public void setPriority(int priority) {
        this.priority = priority;
    }
    public ArrayList<PhoneNumber> getNumbers() {
        return numbers;
    }
    public void addNumber(PhoneNumber number) {
        numbers.add(number);
    }
}

class PhoneNumber {
    private String number;
    private String type;
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
}
import java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.util.ArrayList;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
公共类testYaml{
公共静态void main(字符串[]args){
//定义我们的数组
联系人=新联系人();
接触;
电话号码;
//联系人1
触点=新触点();
联系人:setName(“John Johny”);
联系人:setCompany(“ABC公司”);
联系人:设置优先级(1);
phoneNumber=新的phoneNumber();
电话号码。设置号码(“+111111”);
电话号码。设置类型(“主页”);
联系人:addNumber(电话号码);
电话号码。设置号码(“+222222”);
电话号码。设置类型(“工作”);
联系人:addNumber(电话号码);
联系人。添加联系人(联系人);
//联系人2
触点=新触点();
联系人:setName(“Janes Bond”);
联系公司(“X部门”);
联系人:设置优先级(3);
phoneNumber=新的phoneNumber();
电话号码。设置号码(“+007007”);
电话号码。设置类型(“机密”);
联系人:addNumber(电话号码);
联系人。添加联系人(联系人);
//联系人3
触点=新触点();
联系人:setName(“绅士”);
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;

public class testYaml {
    public static void main(String[] args) {
        // Define our array
        Contacts contacts = new Contacts();
        Contact contact;
        PhoneNumber phoneNumber;
        // Contact 1
        contact = new Contact();
        contact.setName("John Johny");
        contact.setCompany("ABC Corp");
        contact.setPriority(1);
        phoneNumber = new PhoneNumber();
        phoneNumber.setNumber("+111111");
        phoneNumber.setType("home");
        contact.addNumber(phoneNumber);
        phoneNumber.setNumber("+222222");
        phoneNumber.setType("work");
        contact.addNumber(phoneNumber);
        contacts.addContact(contact);
        // Contact 2
        contact = new Contact();
        contact.setName("Janes Bond");
        contact.setCompany("Dept X");
        contact.setPriority(3);
        phoneNumber = new PhoneNumber();
        phoneNumber.setNumber("+007007");
        phoneNumber.setType("secret");
        contact.addNumber(phoneNumber);
        contacts.addContact(contact);
        // Contact 3
        contact = new Contact();
        contact.setName("The Gentelman");
        contact.setCompany("XYZ Corp");
        contact.setPriority(1);
        phoneNumber = new PhoneNumber();
        phoneNumber.setNumber("+111222");
        phoneNumber.setType("mobile");
        contact.addNumber(phoneNumber);
        phoneNumber = new PhoneNumber();
        phoneNumber.setNumber("+222111");
        phoneNumber.setType("work");
        contact.addNumber(phoneNumber);
        contacts.addContact(contact);
        // Write yaml file
        ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory());
        try {
            yamlMapper.writeValue(new FileOutputStream("C:/Temp/contacts.yaml"),contacts);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // Read yamlFIle and populate contacts
        Contacts contacts1 = new Contacts();
        ObjectMapper yamlMapper1 = new ObjectMapper(new YAMLFactory());
        try {
            contacts1 = yamlMapper1.readValue(new FileInputStream("C:/Temp/contacts.yaml"),Contacts.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Contacts {
    private ArrayList<Contact> contacts = new ArrayList<Contact>();
    public void addContact (Contact contact) {
        contacts.add(contact);
    }
    public ArrayList<Contact> getContacts() {
        return contacts;
    }
}

class Contact {
    private String name;
    private String company;
    private int priority;
    private ArrayList<PhoneNumber> numbers = new ArrayList<PhoneNumber>();
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCompany() {
        return company;
    }
    public void setCompany(String company) {
        this.company = company;
    }
    public int getPriority() {
        return priority;
    }
    public void setPriority(int priority) {
        this.priority = priority;
    }
    public ArrayList<PhoneNumber> getNumbers() {
        return numbers;
    }
    public void addNumber(PhoneNumber number) {
        numbers.add(number);
    }
}

class PhoneNumber {
    private String number;
    private String type;
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
}