gpt4 book ai didi

kotlin - 在 Kotlin 中读取和处理 HOCON

转载 作者:IT老高 更新时间:2023-10-28 13:47:06 28 4
gpt4 key购买 nike

我想从 HOCON (Typesafe Config) 文件中将以下配置读入 Kotlin。

tablename: {  
columns: [
{ item: { type: integer, key: true, null: false } }
{ desc: { type: varchar, length: 64 } }
{ quantity: { type: integer, null: false } }
{ price: { type: decimal, precision: 14, scale: 3 } }
]
}

事实上,我想提取关键列。到目前为止,我已经尝试了以下方法。

val metadata = ConfigFactory.parseFile(metafile)
val keys = metadata.getObjectList("${tablename.toLowerCase()}.columns")
.filter { it.unwrapped().values.first().get("key") == true }

但它失败并出现以下错误。

Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@kotlin.internal.InlineOnly public operator inline fun <@kotlin.internal.OnlyInputTypes K, V> kotlin.collections.Map<out kotlin.String, ???>.get(key: kotlin.String): ??? defined in kotlin.collections

很明显,Kotlin 无法理解 Map 中“值”字段的数据类型。如何声明或让 Kotlin 知道?

也不是说这个 Map 中有不同的类型和可选的键。

PS:我知道有几个可用于 Kotlin 的包装器,例如 Konfig 和 Klutter。我希望如果这很容易编写,我可以避免使用另一个库。

更新 1:

我已经尝试了以下方法。

it.unwrapped().values.first().get<String, Boolean>("key")

得到以下编译器错误。

Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@kotlin.internal.InlineOnly public operator inline fun <@kotlin.internal.OnlyInputTypes K, V> kotlin.collections.Map<out kotlin.String, kotlin.Boolean>.get(key: kotlin.String): kotlin.Boolean? defined in kotlin.collections

还有这个

it.unwrapped().values.first().get<String, Boolean?>("key")

有输出

Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@kotlin.internal.InlineOnly public operator inline fun <@kotlin.internal.OnlyInputTypes K, V> kotlin.collections.Map<out kotlin.String, kotlin.Boolean?>.get(key: kotlin.String): kotlin.Boolean? defined in kotlin.collections

更新 2:

看看其他地方的处理方式,我想我可能需要使用反射。在我有限的曝光范围内尝试一下。到目前为止没有运气。

最佳答案

考虑您的代码,解构如下:

val keys = metadata.getObjectList("tablename.columns")
.filter {
val item:ConfigObject = it
val unwrapped:Map<String,Any?> = item.unwrapped()
val values:Collection<Any?> = unwrapped.values
val firstValue:Any? = values.first()
firstValue.get("key") == true // does not compile
}

从上面看问题应该很明显了。您需要使用 firstValue 包含 Map 的信息来帮助编译器,如下所示:

val firstValueMap = firstValue as Map<String,Any?>
firstValueMap["key"] == true

关于kotlin - 在 Kotlin 中读取和处理 HOCON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37092808/

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