【问题标题】:How to flatten dynamic yaml file using java如何使用java展平动态yaml文件
【发布时间】:2021-08-23 05:51:33
【问题描述】:

我想将使用 java 的动态 yaml 文件解析为 HashMap 并使用点语法(即“a.b.d”)访问它们

给定以下 example.yml:

        ---
a:
  b:
    c: "Hello, World"
    d: 600

并且可以将其获取为

 outPutMap.get("a.b.d");

Results:
600

知道我们如何实现这一目标吗?

【问题讨论】:

  • Yaml 比地图结构更丰富。
  • @ThorbjørnRavnAndersen 同意。我有嵌套的带有点格式(a.b.d)的键,我想在 yaml 结构中搜索它并获取它的值。而且yaml可以是动态结构,所以不能为它创建类。

标签: java yaml snakeyaml


【解决方案1】:

正如 Thorbjørn 在评论中所说,HashMap 可能不是表示 YAML 文件的正确数据结构。

您应该尝试查看 tree structures

大概是这样的:

public class Node {

  private final String name;
  private final Object value;
  private final Node parent;
  private final Collection<Node> children = new ArrayList<Node>();

  public Node(Node parent, String name) {
    this.parent = parent;
    this.name = name;
  }

  public Node getParent() {
    return this.parent;
  }

  public String getName() {
    return this.name;
  }

  public Collection<Node> getChildren() {
    return this.children;
  }

  public void addChild(Node child) {
    child.parent = this;
    children.add(child);
  }

}

然后您只需逐行解析 YAML 文件并构建节点,将所有从属节点添加为最近的父节点的子节点。

最终,您将拥有一个填充的树结构,从顶部的 Node 开始,一直向下贯穿树中的每个 Node

然后您可以编写一个方法来解析您想要的点语法中的字符串,然后相应地导航树结构以找到想要的Node

请注意,将值存储为Objects 不是一个好主意,您应该实现某种值包装器,例如 NumberValue(将值存储为 double)和 StringValue(将值存储为String),这样您就不必将 Objects 转换为不同的类型。

【讨论】:

    猜你喜欢
    • 2018-06-26
    • 2019-12-14
    • 2019-05-16
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多