Java 如何使用SnakeYaml读取字符串列表

Java 如何使用SnakeYaml读取字符串列表,java,yaml,snakeyaml,Java,Yaml,Snakeyaml,我想用SnakeYaml读取一个简单的YAML文件 #My project name: glog dependencies: bling blong 使用这个简单的Java类: public class Project { private String name; private ArrayList<String> dependencies = new ArrayList<String>(); private f

我想用SnakeYaml读取一个简单的YAML文件

#My project 
  name: glog
  dependencies: 
    bling
    blong
使用这个简单的Java类:

public class Project {
    private String name;

    private ArrayList<String> dependencies = new ArrayList<String>();


    private final IvyManager ivyManager = new IvyManager();

    public Project() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ArrayList<String> getDependencies() {
        return dependencies;
    }

    public void setDependencies(ArrayList<String> dependencies) {
        this.dependencies = dependencies;
    }
}
不幸的是,这不起作用。我有以下错误:

Cannot create property=dependencies for JavaBean=ninja.core.Project@26653222
 in 'string', line 2, column 3:
      name: glog
      ^
Can't construct a java object for scalar tag:yaml.org,2002:str; No String constructor found. Exception=java.util.ArrayList.<init>(java.lang.String)
 in 'string', line 4, column 5:
        bling
        ^

    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:308)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:189)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:341)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:141)
    at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:127)
    at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:450)
    at org.yaml.snakeyaml.Yaml.loadAs(Yaml.java:427)
    at ninja.core.ProjectLoader.load(ProjectLoader.java:20)
    at ninja.command.Command.loadCurrentProject(Command.java:44)
    at ninja.command.EclipseCommand.execute(EclipseCommand.java:18)
    at ninja.cmd.Main.execute(Main.java:39)
    at ninja.cmd.Main.main(Main.java:15)
Caused by: org.yaml.snakeyaml.error.YAMLException: Can't construct a java object for scalar tag:yaml.org,2002:str; No String constructor found. Exception=java.util.ArrayList.<init>(java.lang.String)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructScalar.construct(Constructor.java:406)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:297)
    ... 12 more
Caused by: java.lang.NoSuchMethodException: java.util.ArrayList.<init>(java.lang.String)
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.getConstructor(Class.java:1825)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructScalar.construct(Constructor.java:404)
    ... 14 more
无法为JavaBean=ninja.core创建属性=依赖项。Project@26653222
在“字符串”第2行第3列中:
姓名:glog
^
无法为标量标记构造java对象:yaml.org,2002:str;找不到字符串构造函数。Exception=java.util.ArrayList。(java.lang.String)
在“字符串”第4行第5列中:
闪光
^
位于org.yaml.snakeyaml.constructor.constructor$ConstructMapping.constructJavaBean2ndStep(constructor.java:308)
位于org.yaml.snakeyaml.constructor.constructor$ConstructMapping.construct(constructor.java:189)
位于org.yaml.snakeyaml.constructor.constructor$constructionyamlobject.construct(constructor.java:341)
位于org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
位于org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:141)
位于org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:127)
位于org.yaml.snakeyaml.yaml.loadFromReader(yaml.java:450)
位于org.yaml.snakeyaml.yaml.loadAs(yaml.java:427)
在ninja.core.ProjectLoader.load(ProjectLoader.java:20)
位于ninja.command.command.loadCurrentProject(command.java:44)
在ninja.command.EclipseCommand.execute(EclipseCommand.java:18)
在ninja.cmd.Main.execute(Main.java:39)
位于ninja.cmd.Main.Main(Main.java:15)
原因:org.yaml.snakeyaml.error.YAMLException:无法为标量标记构造java对象:yaml.org,2002:str;找不到字符串构造函数。Exception=java.util.ArrayList。(java.lang.String)
位于org.yaml.snakeyaml.constructor.constructor$ConstructScalar.construct(constructor.java:406)
位于org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
位于org.yaml.snakeyaml.constructor.constructor$ConstructMapping.constructJavaBean2ndStep(constructor.java:297)
... 还有12个
原因:java.lang.NoSuchMethodException:java.util.ArrayList。(java.lang.String)
位于java.lang.Class.getConstructor0(Class.java:3082)
位于java.lang.Class.getConstructor(Class.java:1825)
位于org.yaml.snakeyaml.constructor.constructor$ConstructScalar.construct(constructor.java:404)
... 14多

那里的
字符串
类是否有问题?Yaml对于预期用例无效

改为写:

#My project 
  name: glog
  dependencies: 
    - bling
    - blong

依赖项
不是标量,而是列表。必须明确定义列表值:

#My project 
  name: glog
  dependencies: 
    - bling
    - blong

YAML是正确的,依赖项是标量,在本例中是字符串“bling blong”

检查YAML总是有帮助的,例如使用一些在线验证器/转换器。例如,这家公司。如果您在那里转换为JSON,您会看到问题所在,而且您可以交互地尝试,直到输出更适合您在代码中期望的内容,然后使用:

#My project
  name: glog
  dependencies:
    - bling
    - blong

请注意,某些在线解析器无法处理您的代码(不这样做是不正确的:例如,它们无法处理原始或最终形式的示例)。

依赖项
是标量字符串,
bling blong
也是标量字符串。随着您的更改,映射键
依赖项
的值已成为一个列表,但是
依赖项
当然仍然是一个标量
#My project
  name: glog
  dependencies:
    - bling
    - blong