如何将我的 YAML 文件加载到案例 class 中?
How can I load my YAML file into a case class?
我有一个 Scala 应用程序需要读取 Yaml 文件并将其加载到 Scala 案例中 class。我正在使用 snakeyaml 来完成这项工作,但加载函数似乎无法使用我的案例 class 的构造函数。以下是我正在做的一个例子:
Yaml 文件:
name: "Jon"
age: 50
gender: "male"
案例Class:
final case class Person(
name: String,
age: Int,
gender: String
)
提取和加载 YAML 的代码:
val text: String = scala.io.Source.fromFile(file).mkString
val yaml = new Yaml(new Constructor(implicitly[ClassTag[T]].runtimeClass))
yaml.load(text).asInstanceOf[T]
我收到以下错误:
org.yaml.snakeyaml.constructor.ConstructorException: Can't construct a java object for tag:yaml.org,2002:case_classes.Person; exception=java.lang.InstantiationException: NoSuchMethodException:case_classes.Person.<init>()
我该怎么做才能消除错误?
显然错误是因为 Snakeyaml 试图调用无参数构造函数,然后使用 setter 设置所有属性。
这永远不会与 Scala case class
一起使用,因为它们既没有无参数构造函数也没有设置器。 Source.
您可以使用 circe-yaml.
作为解决方法
我有一个 Scala 应用程序需要读取 Yaml 文件并将其加载到 Scala 案例中 class。我正在使用 snakeyaml 来完成这项工作,但加载函数似乎无法使用我的案例 class 的构造函数。以下是我正在做的一个例子:
Yaml 文件:
name: "Jon"
age: 50
gender: "male"
案例Class:
final case class Person(
name: String,
age: Int,
gender: String
)
提取和加载 YAML 的代码:
val text: String = scala.io.Source.fromFile(file).mkString
val yaml = new Yaml(new Constructor(implicitly[ClassTag[T]].runtimeClass))
yaml.load(text).asInstanceOf[T]
我收到以下错误:
org.yaml.snakeyaml.constructor.ConstructorException: Can't construct a java object for tag:yaml.org,2002:case_classes.Person; exception=java.lang.InstantiationException: NoSuchMethodException:case_classes.Person.<init>()
我该怎么做才能消除错误?
显然错误是因为 Snakeyaml 试图调用无参数构造函数,然后使用 setter 设置所有属性。
这永远不会与 Scala case class
一起使用,因为它们既没有无参数构造函数也没有设置器。 Source.
您可以使用 circe-yaml.
作为解决方法