如何使用 java 展平动态 yaml 文件
How to flatten dynamic yaml file using java
我想使用 java 将动态 yaml 文件解析为 HashMap 并使用点语法访问它们(即“a.b.d”)
给出以下 example.yml:
---
a:
b:
c: "Hello, World"
d: 600
并且可以将其获取为
outPutMap.get("a.b.d");
Results:
600
知道如何实现吗?
正如 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
.
请注意,将值存储为 Object
s 不是一个好主意,您应该实现某种值包装器,例如 NumberValue(将值存储为 double
)和 StringValue (将值存储为 String
),这样您就不必将 Object
转换为不同的类型。
我想使用 java 将动态 yaml 文件解析为 HashMap 并使用点语法访问它们(即“a.b.d”)
给出以下 example.yml:
---
a:
b:
c: "Hello, World"
d: 600
并且可以将其获取为
outPutMap.get("a.b.d");
Results:
600
知道如何实现吗?
正如 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
.
请注意,将值存储为 Object
s 不是一个好主意,您应该实现某种值包装器,例如 NumberValue(将值存储为 double
)和 StringValue (将值存储为 String
),这样您就不必将 Object
转换为不同的类型。