Sunday, 3 June 2018

Jackson: deserialise a map from yaml

Below statements convert the yaml string to a map.

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
TypeFactory typeFactory = mapper.getTypeFactory();
MapType mapType = typeFactory.constructMapType(HashMap.class, Interger.class, Employee.class);
Map<String, Employee> map = mapper.readValue(yaml, mapType);

Find the below working application.

Employee.java
package com.sample.model;

public class Employee {

 private int id;
 private String firstName;
 private String lastName;

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getFirstName() {
  return firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }

 @Override
 public String toString() {
  return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]";
 }

}

YAMLUtil.java
package com.sample.util;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.fasterxml.jackson.databind.type.MapType;
import com.fasterxml.jackson.databind.type.TypeFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;

public class YAMLUtil {

 private static ObjectMapper mapper = new ObjectMapper(new YAMLFactory());

 public static void printYAML(Object obj) throws JsonGenerationException, JsonMappingException, IOException {
  mapper.writeValue(System.out, obj);
 }

 public static String getYAML(Object obj) throws JsonProcessingException {
  return mapper.writeValueAsString(obj);
 }

 public static <T> T getObject(String yaml, Class<T> clazz)
   throws JsonParseException, JsonMappingException, IOException {
  return mapper.readValue(yaml, clazz);

 }

 public static <T> List<T> getListOfObjects(String yaml, Class<T> clazz)
   throws JsonParseException, JsonMappingException, IOException {
  CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, clazz);
  List<T> listOfObjects = mapper.readValue(yaml, listType);
  return listOfObjects;
 }

 public static <K, V> Map<K, V> getMapOfObjects(String yaml, Class<K> keyClazz, Class<V> valueClazz)
   throws JsonParseException, JsonMappingException, IOException {
  TypeFactory typeFactory = mapper.getTypeFactory();
  MapType mapType = typeFactory.constructMapType(HashMap.class, keyClazz, valueClazz);
  return mapper.readValue(yaml, mapType);
 }
}

Test.java
package com.sample.app;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.sample.model.Employee;
import com.sample.util.YAMLUtil;

public class Test {

 public static void main(String args[]) throws IOException {
  Map<Integer, Employee> map = new HashMap<>();

  Employee emp1 = new Employee();
  emp1.setId(1);
  emp1.setFirstName("Krishna");
  emp1.setLastName("Gurram");

  Employee emp2 = new Employee();
  emp2.setId(2);
  emp2.setFirstName("Rama");
  emp2.setLastName("Gm");

  map.put(emp1.getId(), emp1);
  map.put(emp2.getId(), emp2);

  System.out.println("Converting map to yaml");
  String yaml = YAMLUtil.getYAML(map);
  System.out.println(yaml);

  System.out.println("Converting yaml to map");
  Map<Integer, Employee> result = YAMLUtil.getMapOfObjects(yaml, Integer.class, Employee.class);

  for (Integer key : result.keySet()) {
   Employee emp = result.get(key);
   System.out.println("id : " + emp.getId());
   System.out.println("first name : " + emp.getFirstName());
   System.out.println("last name : " + emp.getLastName() + "\n");
  }

 }
}


Output
Converting map to yaml
---
1:
  id: 1
  firstName: "Krishna"
  lastName: "Gurram"
2:
  id: 2
  firstName: "Rama"
  lastName: "Gm"

Converting yaml to map
id : 1
first name : Krishna
last name : Gurram

id : 2
first name : Rama
last name : Gm







Previous                                                 Next                                                 Home

No comments:

Post a Comment