java - 如何声明泛型类 - jackson yaml 反序列化器
问题描述
将问题简化为只关注与问题相关的部分。
- 我的程序有两个类 - 联系人、电话号码。
- 联系人具有常用字段 - 姓名、公司等,电话号码也具有诸如 phoneNumber、类型等字段。两者都有常用的 get/set 方法。
- Contact 类有一个 addPhoneNumber 方法可以将电话号码添加到 phoneNumber ArrayList,因此它缺少相应的 set 方法。
- 联系人包含电话号码的 ArrayList,而我的程序包含联系人的 ArrayList。
- 我正在使用带有 Snakeyaml 的 Jackson 解析器。
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;
}
}
解决方案
推荐阅读
- java - 调用 init 方法失败;嵌套异常是 org.hibernate.AnnotationException: mappedBy reference an unknown target entity property:
- angular - 角材料步进器不起作用 - 角 6
- android - 在片段内创建 SQLite 数据库 Helper 类的实例
- wpf - 在 wpf 中创建像 Powerpoint 缩略图一样的缩略图预览
- google-chrome-extension - 从扩展程序中删除 URL
- ruby-on-rails - 添加标题后,在 wicked_pdf Rails 中获取空白 pdf 页面
- javascript - 使用 Javascript 将 HTML + CSS 转换为 PDF
- reactjs - React Router 4 在谷歌缓存上显示 404 页面
- android - 在两个片段之间传递参数,每个片段在不同的导航图中
- java - 如何以正确的方式在 JavaFX 中实现启动和暂停功能?