YAML Объединить одну последовательность и десериализовать с помощью SnakeYAML JAVA

Я пытаюсь объединить значения последовательности с YAML, чтобы после десериализации с SnakeYAML с JAVA.

Я ожидал этого результата:

{
  "root": {
    "seq4": [
      "001", 
      "002",
      "003"
    ], 
    "seq3": [
      "001", 
      "002",
      "003"
    ], 
    "seq2": [
      "001", 
      "002"
    ], 
    "seq1": [
      "001", 
      "002"
    ]
  }
}

Но это невозможно для меня с этим примером YAML:

root: 
  seq1: &seq1
    - '001' #first
    - '002' #secod
  seq2: *seq1
  seq3: &seq3
    *seq1
    - '003' #third
  seq4: *seq3

Этот пример возвращает сообщение:

при анализе отображения блока в "", строка 2, столбец 3: seq1: &anch1 ^ ожидается, но найдено '' в "", строка 7, столбец 5: *anch1 ^

пример

Кроме того, я проверяю это определение YAML, но возвращаю ошибку:

root: 
  seq1: &anch1
    - '001' #first
    - '002' #secod
  seq2: *anch1
  seq3: &anch2
    <<: *anch1
    - '003' #third
  seq4: *anch2

Любая идея?? Спасибо

2 ответа

Нашел вот это: вопрос Github. Так что ваш сценарий был бы невозможен...

Также посмотрите на этот вопрос, касающийся объединения массивов YAML: Как объединить массивы YAML

Обходной путь - назначить уникальные ключи значениям, например так:

root: 
  seq1: &anch1
    1: '001' #first
    2: '002' #secod
  seq2: *anch1
  seq3: &anch2
    <<: *anch1
    3: '003' #third
  seq4: *anch2

Это даст:

"root": {
  "seq3": {
    "1": "001", 
    "2": "002", 
    "3": "003"
  }, 
  "seq2": {
    "1": "001", 
    "2": "002"
  }, 
  "seq1": {
    "1": "001", 
    "2": "002"
  }, 
  "seq4": {
    "1": "001", 
    "2": "002", 
    "3": "003"
  }
}

В YAML нет независимого от языка элемента последовательности, как есть независимый от языка ключ слияния для отображений.

Одна из причин этого заключается в том, что вы все еще можете использовать ключ слияния (<<) без специального значения, если значение не является отображением.

Конечно, вы можете сделать что-то вроде:

root: 
  seq1: &seq1
    - '001' #first
    - '002' #secod
  seq2: *seq1
  seq3: !CombineSequences &seq3
    - *seq1
    - ['003'] #third
  seq4: *seq3

И есть специальный тип CombineSequences который объединяет свои элементы в один большой список / массив.

Другие вопросы по тегам