gpt4 book ai didi

java - SnakeYAML 低级 API 无法正确解析 MapNode

转载 作者:行者123 更新时间:2023-11-30 01:47:43 28 4
gpt4 key购买 nike

我想对 yml 文件中的值进行一些处理。有人建议我使用snakeYAML的low-level API以此目的。因此,我使用它编写了一些代码,但由于以下原因,我几乎陷入困境。

这是我编写的代码:

public static void main(String[] args) throws Exception{
Yaml yaml = new Yaml();
FileReader contentFromFile=new FileReader("/Users/prakash.tiwari/Desktop/yamlInput.yml");
for (Node node : yaml.composeAll(contentFromFile)) {
System.out.println(node);
}
}

这是我的yamlInput.yml :

Prakash: 
Lucky:
Number: 11

Really? : NotAtAll

这是控制台上打印的内容(它在一行中,我对其进行了格式化并添加了注释以使其可读):

<org.yaml.snakeyaml.nodes.MappingNode 
(
tag=tag:yaml.org,2002:map,
values=
{
key=<org.yaml.snakeyaml.nodes.ScalarNode (tag=tag:yaml.org,2002:str, value=Prakash)>;
value=355629945 // Why is this a garbage value?
}
{
key=<org.yaml.snakeyaml.nodes.ScalarNode (tag=tag:yaml.org,2002:str, value=Really?)>;
value=
<NodeTuple
keyNode=<org.yaml.snakeyaml.nodes.ScalarNode (tag=tag:yaml.org,2002:str, value=Really?)>;
valueNode=<org.yaml.snakeyaml.nodes.ScalarNode (tag=tag:yaml.org,2002:str, value=NotAtAll)>
>
}
)>

此时我可以提取valueNode这也是 ScalarNode通过搜索 valueNode=<org.yaml.snakeyaml.nodes.ScalarNode然后处理该节点中的值。

但问题是我不知道为什么它在组成 map 节点时会放置垃圾值。这是我的问题:

  1. 如何正确编写 yaml 文件以使 map 节点正确显示而不是垃圾值?
  2. 完成处理并成功用处理后的值替换这些值后,如何将这些值放回到 yaml 文件中?
  3. 如果您认为这是一种垃圾方法,请向我推荐一个更好的方法。

最佳答案

您获得“垃圾值”的原因是 MappingValue's toString method 中的这一部分:

if (node.getValueNode() instanceof CollectionNode) {
// to avoid overflow in case of recursive structures
buf.append(System.identityHashCode(node.getValueNode()));
} else {
buf.append(node.toString());
}

由于组合图可能包含循环(因为 anchor 和别名已在解析的此阶段解析),toString 不会递归到集合节点(即映射和序列)。

这意味着您的节点树确实已正确组成,您根本不应该使用 toString 来检查它。这回答了你的第一个问题。

要将其写回 YAML 文件,请使用类似的内容

Emitter emitter = new Emitter(/* e.g. a FileWriter */ writer, new DumperOptions());
for (Event event : yaml.serialize(/* the root node */ node)) {
emitter.emit(event);
}

回答问题 3:在上一个问题中,您提到您想要更改(加密)某些值并保持其他值不变。如果是这种情况,我建议您使用 yaml.parse 而不是 yaml.compose,因为处理事件流时丢失的信息比处理组合图时丢失的信息少(这意味着输出将与输入更加相似)。

然后,您可以检查生成的事件,识别要更改的事件并将其替换为更改后的事件,然后使用像我在上面的代码中所示的发射器。

我展示了一些Python代码here如何从字符串列表(类似于“YAML 路径”)中识别事件流中的事件,但是该代码会在给定路径中插入事件而不是更改它们。 Python 和 Java API 有点相似,因此如果您可以阅读 Python,那么该代码可能会对您有所帮助。

关于java - SnakeYAML 低级 API 无法正确解析 MapNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57339814/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com