gpt4 book ai didi

scala - 如何在 Typesafe Config 中获取未包装的 key ?

转载 作者:行者123 更新时间:2023-12-04 07:38:32 25 4
gpt4 key购买 nike

测试用例:

import org.specs2.mutable._
class HelloWorldSpec extends Specification {
"Typesafe Config" should "allow me to see my escaped key" in {
val entries = ConfigFactory.parseString("""
"quoted.key.1" = 5
"quoted.key.2" = 6""").entrySet
entries.head.getKey === "quoted.key.1"
}
}

此测试失败,因为 key 实际上是 "quoted.key.1" ,不是 quoted.key.1 .有没有建议的方法来解开这个,还是我必须手动查找周围的引号并每次都删除它们?

最佳答案

在此处的 API 文档中阅读“路径、键和配置与 ConfigObject”:http://typesafehub.github.io/config/latest/api/com/typesafe/config/Config.html
并在此处的自述文件中:https://github.com/typesafehub/config#understanding-config-and-configobject

(欢迎提出改进这些文档的建议。)

条目集中(和配置)中的键是路径表达式。这些是需要解析的字符串。 ConfigUtil中有解析方法,见http://typesafehub.github.io/config/latest/api/com/typesafe/config/ConfigUtil.html#splitPath%28java.lang.String%29

仅删除引号是行不通的,解析比这要复杂一些。幸运的是,您可以使用 ConfigUtil.splitPath方法。

因此,在根级别迭代键的两种方法类似于,首先使用 Config:

Config config = ... ;
for (Map.Entry<String, ConfigValue> entry: config.entrySet()) {
String[] keys = ConfigUtil.splitPath(entry.getKey());
System.out.println("Root key = " + keys[0]);
}

然后使用 ConfigObject:
Config config = ... ;
for (Map.Entry<String, ConfigValue> entry: config.root().entrySet()) {
System.out.println("Root key = " + entry.getKey());
}

我没有尝试编译上面的例子,所以请原谅任何愚蠢的语法错误。

如果你的配置只包含一层(没有嵌套对象),上面两种迭代方式是一样的;但是如果你有嵌套的值,它们就不一样了,因为迭代 Config将在迭代时为您提供所有叶值 ConfigObject ( config.root() ) 将为您提供根的所有直接子项,即使这些直接子项本身就是对象。

说你有:
foo {
bar {
baz = 10
}
}

如果您将其迭代为 Config您将获得一个条目,其路径为 foo.bar.baz作为键和值 10 .如果您将其迭代为 ConfigObject那么您将有一个条目,其中包含 key foo并且该值将是一个对象,该对象又将包含键 bar .当将此作为 Config 迭代时你可以 splitPath foo.bar.baz你会得到一个包含三个字符串的数组, foo , bar , 和 baz .

转换 ConfigConfigObject使用 root()方法和转换 ConfigObjectConfig使用 toConfig()方法。所以 config.root().toConfig() == config .

此外,上面的配置文件可以等效地写为:
foo.bar.baz = 10

但如果写成:
"foo.bar.baz" = 10

因为在第一种情况下,您有嵌套的对象,而在第二种情况下,您有一个键名中带有句点的对象。这是由于引号引起的。

如果你写 "foo.bar.baz"带引号,然后在迭代时 Config您返回的路径将被引用和 splitPath()将返回一个包含一个元素的数组 foo.bar.baz .迭代时 ConfigObject您将有一个包含 foo.bar.baz 条目的对象作为关键和 10作为值(value)。包含 . 的 key 或其他特殊字符必须被引用,以便将它们解释为单个键而不是路径。

要使您的测试用例通过,您可以使用 splitPath 执行此操作:
import org.specs2.mutable._
class HelloWorldSpec extends Specification {
"Typesafe Config" should "allow me to see my escaped key" in {
val entries = ConfigFactory.parseString("""
"quoted.key.1" = 5
"quoted.key.2" = 6""").entrySet
// the ordering of entrySet is not guaranteed so this may
// still fail because it gets quoted.key.2 instead
ConfigUtil.splitPath(entries.head.getKey).head === "quoted.key.1"
}
}

你也可以这样做,使用 ConfigObject :
import org.specs2.mutable._
class HelloWorldSpec extends Specification {
"Typesafe Config" should "allow me to see my escaped key" in {
val entries = ConfigFactory.parseString("""
"quoted.key.1" = 5
"quoted.key.2" = 6""").root.entrySet // note ".root." here
// the ordering of entrySet is not guaranteed so this may
// still fail because it gets quoted.key.2 instead
// no need to splitPath because ConfigObject has keys not paths
entries.head.getKey === "quoted.key.1"
}
}

关于scala - 如何在 Typesafe Config 中获取未包装的 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21738023/

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