Search code examples
jacksonyamljackson-databind

Formatting YAML with Jackson


I am using the Jackson library to convert Java objects to YAML format. Based on the documentation I found on the Internet, I was able to quickly write a function that does the conversion.

I am seeking to convert the following classes to YAML:

public class RequestInfo
{
   private String thePath;
   private String theMethod;
   private String theURL;

   private List<ParamInfo> theParams = new ArrayList<>();

   // getters and setters
}

public class ParamInfo
{
    private String paramName;
    private String paramType;

   // getters and setters
}

Using Jackson's ObjectMapper, I can easily generate the YAML:

public String basicTest()
{
   ObjectMapper theMapper = new ObjectMapper(new YAMLFactory());
   RequestInfo info = new RequestInfo();

   info.setThePath("/");
   info.setTheMethod("GET");
   info.setTheURL("http://localhost:8080/");

   List<ParamInfo> params = new ArrayList<>();

   params.add(new ParamInfo("resource","path"));

   info.setTheParams(params);

  String ret = null;

  try
  {
     ret = theMapper.writeValueAsString(info);
  }
  catch(Exception exe)
  {
     logger.error(exe.getMessage());
  }

   return(ret);
}

The YAML I get is below:

---
thePath: "/"
theMethod: "GET"
theURL: "http://localhost:8080/"
theParams:
   - paramName: "resource"
     paramType: "path"

The YAML I get is OK, but it has some problems in my eyes. One probem is the "---" that it begins with. Another is the fact that I would like to be able to group the information in a manner similar to the YAML below:

RequestInfo:
   thePath: "/"
   theMethod: "GET"
   theURL: "http://localhost:8080/"
   theParams:
      - paramName: "resource"
        paramType: "path"

All of the examples I am seeing on the Internet use an Employee class, and talk about how to convert that class to YAML, but do not tell how to avoid the "---" (or change it into soething more descriptive). I also cannot find anything that tells how to group the YAML in the manner I describe.

Does anyone know how to do this? Is there a way to eliminate the "---", or create a name (like "RequestInfo") that groups together the translated data in an object?


Solution

  • You can ignore --- by disable YAMLGenerator.Feature.WRITE_DOC_START_MARKER.. If you want to wrap value under class name then u need to use @JsonRootName...

    Try with this:

    RequestInof class:
    
    @JsonRootName("RequestInfo")
    public class RequestInfo
    {
       private String thePath;
       private String theMethod;
       private String theURL;
    
       private List<ParamInfo> theParams = new ArrayList<>();
    
       // getters and setters
    }
    

    Test:

    public String basicTest()
    {
            ObjectMapper theMapper = new ObjectMapper(new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER));
            theMapper.enable(SerializationFeature.WRAP_ROOT_VALUE);   RequestInfo info = new RequestInfo();
    
       info.setThePath("/");
       info.setTheMethod("GET");
       info.setTheURL("http://localhost:8080/");
    
       List<ParamInfo> params = new ArrayList<>();
    
       params.add(new ParamInfo("resource","path"));
    
       info.setTheParams(params);
    
      String ret = null;
    
      try
      {
         ret = theMapper.writeValueAsString(info);
      }
      catch(Exception exe)
      {
         logger.error(exe.getMessage());
      }
    
       return(ret);
    }