Пропустить или игнорировать ошибки синтаксического анализа YAML с Джексоном - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь проанализировать большой файл YAML (более 3000 строк) в приложении Java, загруженном из другой системы (приложение PHP). У меня ограниченный контроль над самим файлом YAML. Изменения вносятся вручную, и синтаксический анализатор YAML в другой системе, кажется, гораздо более прост в отношении форматирования YAML.

Проблема, с которой я сталкиваюсь, заключается в том, что при попытке проанализировать файл с Джексоном я получаю исключение, потому что несколько строк имеют недопустимый символ в конце. Это приводит к неудаче всей попытки разбора.

Есть ли способ настроить или настроить Джексона так, чтобы он просто пропускал строки или блоки YAML, если они искажены или имеют недопустимые токены?

Пример YAML

example.good_yaml:
  description: "Example of good YAML"
example.bad_yaml:
  description: "Example of bad YAML")

Код синтаксического анализа

ObjectMapper mapper = new YAMLMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Map<String, Object> result = mapper.readValue(sourceYaml, new TypeReference<Map<String, Object>>() {});

Ошибка

com.fasterxml.jackson.dataformat.yaml.snakeyaml.error.MarkedYAMLException: while parsing a block mapping
 in 'reader', line 4, column 3:
      description: "Example of bad YAML")
      ^
expected <block end>, but found '<scalar>'
 in 'reader', line 4, column 37:
      description: "Example of bad YAML")
                                        ^

 at [Source: (File); line: 4, column: 37]

1 Ответ

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

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

Имейте в виду, что восстановление после синтаксических ошибок является довольно сложным делом (даже если оно кажется простым для вашего конкретного * сценария использования *), и я не знаю ни одной реализации YAML, которая реализует это (поскольку большинство из них являются переписанными PyYAML / libyaml.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...