Как разобрать файл YAML - PullRequest
       10

Как разобрать файл YAML

2 голосов
/ 27 марта 2020

Я использую синтаксический анализатор YAML Джексона и хочу проанализировать файл YAML без , чтобы вручную создать класс Java, соответствующий файлу yaml. Все примеры, которые я могу найти, сопоставляют его с таким объектом, как здесь: https://www.baeldung.com/jackson-yaml

Файл yaml, который мне дают, не всегда будет одинаковым, поэтому мне нужно разобрать его можно ли достичь этого во время выполнения с помощью jackson-yaml?

Ответы [ 2 ]

3 голосов
/ 27 марта 2020

Если вы не знаете точный формат, вам придется проанализировать данные в дереве и обработать их вручную, что может быть утомительно. Я бы использовал Optional для отображения и фильтрации.

Пример:

public static final String YAML = "invoice: 34843\n"
    + "date   : 2001-01-23\n"
    + "product:\n"
    + "    - sku         : BL394D\n"
    + "      quantity    : 4\n"
    + "      description : Basketball\n"
    + "      price       : 450.00\n"
    + "    - sku         : BL4438H\n"
    + "      quantity    : 1\n"
    + "      description : Super Hoop\n"
    + "      price       : 2392.00\n"
    + "tax  : 251.42\n"
    + "total: 4443.52\n";

public static void main(String[] args) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
    JsonNode jsonNode = objectMapper.readTree(YAML);

    Optional.of(jsonNode)
            .map(j -> j.get("product"))
            .filter(ArrayNode.class::isInstance)
            .map(ArrayNode.class::cast)
            .ifPresent(projectArray -> projectArray.forEach(System.out::println));
}

Вывод:

{"sku":"BL394D","quantity":4,"description":"Basketball","price":450.0}
{"sku":"BL4438H","quantity":1,"description":"Super Hoop","price":2392.0}
3 голосов
/ 27 марта 2020

Как и при разборе JSON, вы можете разобрать в Map:

Пример

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
@SuppressWarnings("unchecked")
Map<String, Object> map = mapper.readValue(new File("test.yaml"), Map.class);
System.out.println(map);

test.yaml

orderNo: A001
date: 2019-04-17
customerName: Customer, Joe
orderLines:
    - item: No. 9 Sprockets
      quantity: 12
      unitPrice: 1.23
    - item: Widget (10mm)
      quantity: 4
      unitPrice: 3.45

Выход

{orderNo=A001, date=2019-04-17, customerName=Customer, Joe, orderLines=[{item=No. 9 Sprockets, quantity=12, unitPrice=1.23}, {item=Widget (10mm), quantity=4, unitPrice=3.45}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...