对于具有多个对象的 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 分钟前发布的回答:Streuzel
是 List
,而不是 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)。
我目前正在尝试弄清楚如何从我的 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 分钟前发布的回答:Streuzel
是 List
,而不是 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)。