在 Kotlin 中读取 YAML 文件

4 java jackson kotlin

我很难弄清楚如何在 Kotlin 中读取 YAML 文件。

简而言之,YAML 具有以下格式:

aws:
  foo:
    dev:
      id: '1111'
    pro:
      id: '2222'
  bar:
    dev:
      id: '3333'
    pro:
      id: '4444'
Run Code Online (Sandbox Code Playgroud)

我创建了这些数据类:

data class Account (
        val id: String
)

data class Owner (
        val accounts: List<Account>
)

data class Cloud (
        val owners: List<Owner>
)
Run Code Online (Sandbox Code Playgroud)

然后我尝试用以下方法解析该文件:

val mapper = ObjectMapper().registerModule(KotlinModule())
val settings: Cloud = mapper.readValue(Path.of("accounts.yaml").toFile())
# also tried this
val settings: List<Cloud> = mapper.readValue(Path.of("accounts.yaml").toFile())
println(settings)
Run Code Online (Sandbox Code Playgroud)

失败printlnException in thread "main" com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'aws': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')

为什么?

k31*_*159 11

您需要包含jackson-dataformat-yaml依赖项,然后像这样创建 ObjectMapper:

val mapper = ObjectMapper(YAMLFactory()).registerModule(KotlinModule())
Run Code Online (Sandbox Code Playgroud)

  • 自 kotlin 2.12.4 起,上述 KotlinModule 构造函数已被弃用,因此请使用 `ObjectMapper(YAMLFactory()).registerKotlinModule()` (6认同)

Ale*_*hin 7

另一种方法是使用Kaml

将以下依赖项添加到您的build.gradle.kts

implementation("com.charleskorn.kaml:kaml:0.46.0")
Run Code Online (Sandbox Code Playgroud)

然后将@Serialized注释添加到您的数据类中:

@Serializable
data class Cloud (
    val owners: List<Owner>
)
Run Code Online (Sandbox Code Playgroud)

然后你可以从 YAML 解析它:


val parsedYaml = Yaml.default.decodeFromString(Cloud.serializer(), Path.of("accounts.yaml").toFile().readText())
Run Code Online (Sandbox Code Playgroud)