【问题标题】:YAML multiple keys with multiple values per elementYAML 多个键,每个元素具有多个值
【发布时间】:2015-10-09 19:43:17
【问题描述】:

在YAML中,我有一个类似下面的结构,用Java反序列化并解析:

events:
  - causes:
    - CAUSE_ONE
    - CAUSE_TWO
    effects:
    - EFFECT_ONE
    - EFFECT_TWO
  - causes:
    - CAUSE_THREE
    effects:
    - EFFECT_THREE

这转换为一个映射数组,其中每个映射包含两个键 - causeseffects,这些键的值是一个字符串数组。我试图实现的是单个对象具有一个或多个事件。每个事件都由一个或多个触发一个或多个结果的原因组成。在上面的例子中,当CAUSE_ONECAUSE_TWO条件都满足时,EFFECT_ONEEFFECT_TWO被触发。当CAUSE_THREE条件满足时,触发EFFECT_THREE

在 Java 中,这将是 Map<String, String>[]List<Map<String, String>>。当causes条目中的所有条件都成功满足时,effects条目中的每个效果都会被启动。

我希望能够在 Java 中反序列化 YAML 数据,以便单个对象可以具有多个事件,当满足一系列条件(原因)时,会触发相应的效果。有没有更好的方式来构建上面的 YAML,或者我可以在不使用地图数组的情况下实现这一点?

【问题讨论】:

  • @Anthon 我修改了我的问题以提供更多关于我所问内容的详细信息。

标签: java yaml


【解决方案1】:

根据具体情况,列表效率低下。如果您可以计算出适用于某个输入的CAUSES,则必须遍历事件列表才能找到匹配项。在这种情况下,您最好:

events: 
    [CAUSE_ONE, CAUSE_TWO]:
      - EFFECT_ONE
      - EFFECT_TWO
    [CAUSE_THREE]:
      - EFFECT_THREE

您在哪里使用计算出的CAUSES 来查找效果。这是有效的 YAML,但依赖于解析器/语言组合才能将序列作为键处理,以表示特定语言中的映射¹。

如果您无法预先计算并且必须检查所有事件,因为可以应用多个事件,则此映射类似于列表。

仅在您无法根据输入预先确定任何原因的情况下,并且如果您可以在找到匹配项时提前退出,那么有一个列表是有意义的(并根据预期的输入对其进行排序)。在所有其他情况下,某种类型的映射(甚至是事件列表的块)对于除小数字之外的所有情况都将更有效(因为计算映射的哈希并进行查找比遍历列表并进行查找更有效)可能会进行更多检查)


¹我不熟悉 JAVA 解析器以及它们的合规性。对于 Python,PyYAML cannot handle this,但 ruamel.yaml(我是作者)可以。

【讨论】:

  • 幸运的是,SnakeYAML 成功解析了它。这使我的 YAML 结构更好,我可以从这里开始工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
相关资源
最近更新 更多