Je voudrais lire la configuration suivante à partir d'un fichier HOCON (Typesafe Config) dans Kotlin.Lecture et traitement HOCON dans 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 } }
]
}
En fait, je voudrais extraire la (les) colonne (s) clé (s). J'ai essayé ce qui suit jusqu'ici.
val metadata = ConfigFactory.parseFile(metafile)
val keys = metadata.getObjectList("${tablename.toLowerCase()}.columns")
.filter { it.unwrapped().values.first().get("key") == true }
Mais il échoue avec l'erreur suivante.
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
Il est clair que Kotlin n'est pas capable de comprendre le type de données du champ "valeur" dans la carte. Comment le déclarer ou laisser savoir à Kotlin?
De plus, il n'y a pas différents types et touches optionnelles dans cette carte. PS: Je sais qu'il existe quelques emballages pour Kotlin tels que Konfig et Klutter. J'espérais que si cela est facile à écrire, je pourrais éviter une autre bibliothèque.
MISE À JOUR 1:
J'ai essayé ce qui suit.
it.unwrapped().values.first().get<String, Boolean>("key")
pour obtenir l'erreur de compilation suivante.
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
Et ce
it.unwrapped().values.first().get<String, Boolean?>("key")
avec sortie
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
MISE À JOUR 2:
En regardant la façon dont il est traité ailleurs, je suppose que je dois probablement utiliser réflexion. Essayer avec mon exposition limitée. Pas de chance jusqu'à présent.
Je n'ai probablement pas besoin de déballer l'objet de configuration. Mais le traiter comme il n'a pas donné de résultats et c'était le plus proche que je pouvais l'amener à "imprimer" quelque chose. –