代码之家  ›  专栏  ›  技术社区  ›  Need Answers Fast

如何将yaml文件加载到case类中?

  •  1
  • Need Answers Fast  · 技术社区  · 6 年前

    我有一个scala应用程序,需要读取yaml文件并将其加载到scala case类中。我正在使用snakeyaml来完成这项工作,但似乎加载函数不能使用我的case类的构造函数。下面是我正在做的一个例子:

    YAML文件:

    name: "Jon"
    age: 50
    gender: "male"
    

    案例类:

    final case class Person(
        name: String, 
        age: Int,
        gender: String
    )
    

    提取和装载山药的代码:

    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>()
    

    我能做些什么来消除错误?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Luis Miguel Mejía Suárez    6 年前

    显然,错误是因为snakeyaml尝试调用no args构造函数,然后使用setter设置所有属性。

    这对斯卡拉来说永远都不管用 case class ,因为它们既没有无参数构造函数也没有setter。 Source .

    为了解决问题,你可以使用 circe-yaml .