3

我想使用 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;
    }
}

为了能够读取文件,我需要准备Yaml解析器,因为dependencies这样的集合:

    Constructor constructor = new Constructor(Project.class);
    TypeDescription projectDesc = new TypeDescription(Project.class);
    projectDesc.putListPropertyType("dependencies", String.class);
    constructor.addTypeDescription(projectDesc);

    Yaml yaml = new Yaml(constructor);
    Project result = yaml.loadAs(FileUtils.readFileToString(f),
            Project.class);

不幸的是,这不起作用。我有以下错误:

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

那里的 String 课有问题吗?

4

3 回答 3

2

您的 YAML 是正确的,并且依赖项是一个标量,在本例中为字符串“bling blong”。

它总是有助于检查您的 YAML,例如使用一些在线验证器/转换器。例如在线 YAML 解析器。如果您在那里转换为 JSON,您会看到问题,此外,您可以交互地尝试一些事情,直到输出更适合您在代码中的期望,然后使用它:

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

请注意,某些在线解析器无法处理您的代码(并且 IMO 不这样做是不正确的:例如,在线将 YAML 转换为 JSONCode Beautify无法处理您的原始示例,也无法处理最终形式的示例。)

于 2015-06-29T07:15:45.867 回答
0

Yaml 对于预期的用例无效。

而是写:

#My project 
  name: glog
  dependencies: 
    - bling
    - blong
于 2015-06-26T08:51:04.907 回答
0

dependencies不是标量,而是一个列表。列表值必须明确定义:

#My project 
  name: glog
  dependencies: 
    - bling
    - blong
于 2015-06-26T11:48:15.947 回答