Форматирование YAML с Джексоном - PullRequest
3 голосов
/ 29 апреля 2020

Я использую библиотеку Джексона для преобразования Java объектов в формат YAML. Основываясь на документации, которую я нашел на Inte rnet, я смог быстро написать функцию, которая выполняет преобразование.

Я пытаюсь преобразовать следующие классы в 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
}

Используя ObjectMapper Джексона, я могу легко сгенерировать 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);
}

YAML, который я получаю ниже:

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

YAML, который я получаю, в порядке, но у него есть некоторые проблемы в моих глазах. Один пробел - это «---», с которого он начинается. Другим является тот факт, что я хотел бы иметь возможность группировать информацию способом, аналогичным приведенному ниже YAML:

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

Все примеры, которые я вижу на Inte rnet, используют класс Employee и поговорим о том, как преобразовать этот класс в YAML, но не говорите, как избежать «---» (или изменить его на более понятный). Я также не могу найти ничего, что говорит о том, как сгруппировать YAML описанным мною способом.

Кто-нибудь знает, как это сделать? Есть ли способ исключить «---» или создать имя (например, «RequestInfo»), которое группирует переведенные данные в объект?

1 Ответ

2 голосов
/ 30 апреля 2020

Вы можете игнорировать ---, отключив YAMLGenerator.Feature.WRITE_DOC_START_MARKER .. Если вы хотите обернуть значение под именем класса, вам нужно использовать @JsonRootName ...

Попробуйте с этим:

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
}

Тест:

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