Ошибка, которую вы получаете, вероятно, связана с тем, что YAML, который вы показываете, не соответствует классу, который вы показываете. someObjList
в ваших данных YAML является отображением (содержит пары ключ-значение, первый ключ которого равен obj1
), в то время как в вашем классе это ArrayList<SomeObject>
. Это соответствует последовательности в ваших данных YAML и должно выглядеть следующим образом:
someObjList:
- objName: strname
strList:
- 100
- 200
- 300
- # (...)
Однако я не уверен, потому что вы на самом деле не показываете код, который выдает ошибку.
При этом, если вы ищете способ поиска в произвольном YAML, не используйте Джексона. Джексон - это инструмент для (де) сериализации, и вы не хотите десериализовать свой YAML; Вы просто хотите пройти его структуру. Для этого вы можете использовать SnakeYAML, который использует синтаксический анализатор YAML, который использует Джексон:
Yaml yaml = new Yaml();
Node root = yaml.compose(new StringReader("foo: bar"));
root
будет либо ScalarNode
, либо MappingNode
, либо SequenceNode
. Последние два будут содержать дочерние узлы, на которые вы можете перейти. Эта структура, безусловно, возможна для XPath-подобного поиска.
Если вы после исполнения, более быстрый способ будет использовать последовательный интерфейс parse
SnakeYaml. По сути, вы постоянно запрашиваете следующее событие у анализатора и проверяете, содержит ли искомый путь его. Если это так, продолжайте запрашивать его дочерние элементы и ищите следующий элемент в пути. Если нет, проанализируйте и выгрузите весь дочерний контент текущего события, а затем продолжите поиск вашего текущего элемента пути.
Если вы можете читать Python, вы можете получить вдохновение от моего ответа здесь , который анализирует входной YAML через события и вы можете указать пути, куда вы хотите добавить данные.