gpt4 book ai didi

java - 在 YAML 嵌套数据中搜索值

转载 作者:行者123 更新时间:2023-12-01 17:46:13 25 4
gpt4 key购买 nike

我目前正在尝试将 YAML 文件解析为运行某些测试的输入/配置。问题是:使用 Jackson,嵌套数据似乎不适合该类,无论我为它设计的结构如何,几乎每次我得到这样的东西:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token

我打算使用类似的 XPath 方法简单地“搜索”YAML 文件中的数据,而不用担心映射对象和有限的嵌套级别。

这是示例类:

public class YAMLInput {

private ArrayList<SomeContainer> containers;
//getter and setters

private class SomeContainer {
private String name;
private String path;
private ArrayList<Integer> intList;
private ArrayList<String> strList;
private ArrayList<SomeObject> someObjList;

private class SomeObject {
private String objectName;
private ArrayList<String> strList;
}

}
}

Yaml 输入:

container:
name: Cont1
path: /storage/outputFolder
intList:
- 100
- 200
- 300
strList:
- strFirst
- strSecond
- strThird
someObjList:
obj1:
objName: strname
strList:
- 100
- 200
- 300
obj2:
# (...)

这个想法是为 YAMLInput 类构建一个构造函数:

public YAMLInput( SearchableYAMLData data) {
for(SearchableYAMLData container : data.getList("container")){
this.containers.add( new SomeContainer());
this.containers.get(0) = container.get("name");
//...
}
}

与这个假设的 SearchableYAMLData 类最接近的可用工具是什么?

最佳答案

您收到的错误可能源于您显示的 YAML 与您显示的类不对应的事实。 someObjList在你的 YAML 数据中是一个映射(包含键值对,第一个键是 obj1 ),而在你的类中,它是一个 ArrayList<SomeObject> 。 。这对应于 YAML 数据中的序列,应如下所示:

someObjList: 
- objName: strname
strList:
- 100
- 200
- 300
- # (...)

但是,我不确定,因为您没有真正显示产生错误的代码。

话虽这么说,如果您正在寻找一种通过任意 YAML 进行搜索的方法,请不要使用 Jackson。 Jackson 是一个用于(反)序列化的工具,并且您不想反序列化您的 YAML;你只想了解它的结构。为此,您可以使用 SnakeYAML,这是 Jackson 使用的 YAML 解析器:

Yaml yaml = new Yaml();
Node root = yaml.compose(new StringReader("foo: bar"));

root将是 ScalarNode ,一个MappingNodeSequenceNode 。后两个将包含您可以下降的子节点。这种结构对于类似 XPath 的搜索当然是可行的。

如果您追求性能,更快的方法是使用顺序 parse SnakeYaml 的接口(interface)。基本上,您不断地从解析器查询下一个事件,并检查您正在搜索的路径是否包含它。如果是,则继续查询其子元素并搜索路径中的下一个元素。如果没有,则解析并转储当前事件的所有子内容,然后继续搜索当前路径元素。

如果你会读Python,你可以从my answer here中得到一些灵感它通过事件解析输入 YAML,您可以指定要附加数据的路径。

关于java - 在 YAML 嵌套数据中搜索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55064605/

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