首页 > 解决方案 > 如何声明泛型类 - jackson yaml 反序列化器

问题描述

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

package testYaml;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

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
        List<Contact> contacts = new ArrayList<Contact>();
        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.add(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.add(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.add(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
        List<Contact> contacts1 = new ArrayList<Contact>();
        List<Contact> contacts2 = new ArrayList<Contact>();
        ObjectMapper yamlMapper1 = new ObjectMapper(new YAMLFactory());
        try {
            contacts1 = yamlMapper1.readValue(new FileInputStream("C:/Temp/contacts.yaml"),
                    (Class<List<Contact>>) contacts1.getClass());
            contacts2 = yamlMapper1.readValue(new FileInputStream("C:/Temp/contacts.yaml"), contacts2.getClass());
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("Done");
    }
}

class Contact {
    String name;
    String company;
    int priority;
    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 {
    String number;
    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;
    }
}

contacts1 和 contacts2 都是 LinkedHashMap 的数组,而不是 Contact 类型的数组。

更新 - 工作代码 这是最终奏效的(将 ArrayList 包含在一个新的联系人类中。但不知道它是否是最佳解决方案。

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

标签: javajacksonyaml

解决方案


推荐阅读