Tôi muốn đọc cấu hình sau từ tệp HOCON (Typesafe Config) vào Kotlin.Đọc và xử lý HOCON ở 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 } }
]
}
Thực tế, tôi muốn trích xuất (các) cột chính. Tôi đã thử những điều sau đây cho đến nay.
val metadata = ConfigFactory.parseFile(metafile)
val keys = metadata.getObjectList("${tablename.toLowerCase()}.columns")
.filter { it.unwrapped().values.first().get("key") == true }
Nhưng không thành công với lỗi sau.
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
Rõ ràng Kotlin không thể hiểu loại dữ liệu của trường "giá trị" trong Bản đồ. Làm thế nào để tôi tuyên bố nó hoặc để Kotlin biết?
Ngoài ra không có các loại khác nhau và các phím tùy chọn trong Bản đồ này.
PS: Tôi biết rằng có một vài trình bao bọc có sẵn cho Kotlin như Konfig và Klutter. Tôi đã hy vọng rằng nếu điều này là dễ dàng để viết tôi có thể tránh một thư viện.
UPDATE 1:
Tôi đã thử những điều sau đây.
it.unwrapped().values.first().get<String, Boolean>("key")
để nhận lỗi trình biên dịch sau.
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
Và đây
it.unwrapped().values.first().get<String, Boolean?>("key")
với sản lượng
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
UPDATE 2:
Nhìn vào cách nó được xử lý ở những nơi khác, tôi đoán tôi có lẽ cần phải sử dụng phản ánh. Đang thử nó với tiếp xúc hạn chế của tôi. Không may mắn cho đến nay.
Tôi có thể không cần phải tháo đối tượng cấu hình. Nhưng đối phó với nó như là không mang lại bất kỳ kết quả và đây là gần nhất tôi có thể mang lại cho nó để "in" một cái gì đó. –