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