YAML合并单个序列并使用Snake反序列化

时间:2018-07-17 09:30:22

标签: java yaml snakeyaml

在将SnakeYAML与JAVA反序列化之后,我试图将序列值与YAML合并到。

我希望得到这样的结果:

{
  "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         ^

example

此外,我探查了此YAML定义,但其返回错误为:

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

有什么主意吗?谢谢

2 个答案:

答案 0 :(得分:1)

在YAML中,没有独立于语言的序列元素,就像没有独立于语言的merge key用于映射一样。

其原因之一是,如果该值不是映射,则仍然可以使用没有特殊含义的合并键(<<)。

您当然可以做类似的事情:

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

并具有一种特殊的类型CombineSequences,它将其元素组合到一个大列表/数组中。

答案 1 :(得分:0)

发现了这个:Github issue。因此,您的方案将是不可能的...

还要查看有关合并YAML数组的问题:How to merge YAML arrays

一种解决方法是为值分配唯一键,如下所示:

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"
  }
}