对于具有多个对象的 YAML 数组,在 Java 中使用什么路径?

What path to use in Java for YAML arrays with multiple objects?

我目前正在尝试弄清楚如何从我的 config.yml 中获取一个字符串到我的 Java 代码中。更具体地说,使用哪个路径获取 "Home", "X:-1 Y:79 Z:3", "Nether""X:23 Y:65 Z:-19" 提取到我的 Java 代码中。我已经尝试过 getConfig().getString("Streuzel[0].name"),但没有用。

YAML:(包含多个对象的数组)

Streuzel:
    -
        name: Home
        coords: X:-1 Y:79 Z:3
    -
        name: Nether
        coords: X:23 Y:65 Z:-19

Java:

Bukkit.broadcastMessage(ChatColor.YELLOW + getConfig().getString("path?") + ChatColor.WHITE + ", " + ChatColor.GREEN + getConfig().getString("path?"));

如果你真的想得到一个列表,你可以使用 getConfig().getList("Streuzel") 这将 return 一个 LinkedHashMap<> 的列表。你可以这样使用它:

LinkedHashMap<String, Object> myObj = (LinkedHashMap<String, Object>) getConfig().getList("Streuzel").get(0);
Bukkit.broadcastMessage(ChatColor.YELLOW + myObj.get("name") + ChatColor.WHITE + ", " + ChatColor.GREEN + myObj.get("coords"));

但是,不推荐这样做。最好使用这样的配置部分:

Streuzel:
    1:
        name: Home
        coords: X:-1 Y:79 Z:3
    2:
        name: Nether
        coords: X:23 Y:65 Z:-19

然后,您可以像这样使用它们:

Bukkit.broadcastMessage(ChatColor.YELLOW + getConfig().getString("Streuzel.1.name") + ChatColor.WHITE + ", " + ChatColor.GREEN + getConfig().getString("Streuzel.1.coords"));

这样,有了部分,就可以更轻松地获取所有内容。如果你想找到所有部分,这样做:

// here is the config with all keys
ConfigurationSection globalSection = getConfig().getConfigurationSection("Streuzel");
for(String keys : globalSection.getKeys(false)) { // all kays: "1", "2" ...
   ConfigurationSection objSection = globalSection.getConfigurationSection(keys);
   // here you can load your object, log it or get content with objSection.getString()
}

其实Streuzel是一个List,不是数组,所以需要用getList(String)代替getString(String)。在您的例子中,此列表的每个元素都是 Map<String, String>。所以,如果你不关心类型转换的安全性(因为 yaml 可以被人类编辑并且它可能会失去结构),你可以使用这样的东西:

((Map<String, String>)config.getList("Streuzel").get(0)).get("name") // Home

但理想情况下,您可以检查“Streuzel”是否为列表以及它是否包含 Map,或者尝试...捕获 ClassCastException。

关于 3 分钟前发布的回答:StreuzelList,而不是 Map!
编辑:他们修复了它

正如其他人所说,您可以通过如下方式获取 Map 列表:

List<Map<String, Object>> list = (List<Map<String, Object>>) getConfig().getList("Streuzel");

虽然这很好用,但我个人不是它的粉丝,希望它能支持类似的东西:

List<ConfigurationSection> sections = getConfig().getSectionList("Streuzel");

但据我所知,Bukkit API 和基于它的 API(如 Simple-YAML)都不支持这个。

I have made an API that does support getting a list of sections,欢迎查看(它同时支持JSON和Yaml)。