Simplifying the problem to only focus on the portion relevant to the question.
- My program has two classes - Contact, PhoneNumber.
- Contact has the usual fields - name, company, etc. and Phone Number too has fields such as phoneNumber, type, etc. Both have the usual get/set methods.
- Contact class has a addPhoneNumber method to add a phone number to the phoneNumber ArrayList so it is missing the corresponding set method.
- A Contact includes an ArrayList of Phone Numbers and my program contains a ArrayList of Contacts.
- I am using Jackson parser with Snakeyaml.
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 and contacts2 are both an array of LinkedHashMap instead of array of Contact type.
Update - Working Code This is what finally worked (enclosing ArrayList in a new class Contacts. Don't know if it is the most optimal solution though.
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;
}
}