Java YAML读取强制转换异常

Java YAML读取强制转换异常,java,yaml,snakeyaml,Java,Yaml,Snakeyaml,我在读取文件时出错 线程“main”java.lang.ClassCastException中的异常:无法将java.lang.String转换为java.util.ArrayList 为什么没有发生?我正在使用YamlSnake库 Person.java: public class Person { int id; String fname; String lname; int age; public Person(int id, String fn

我在读取文件时出错

线程“main”java.lang.ClassCastException中的异常:无法将java.lang.String转换为java.util.ArrayList

为什么没有发生?我正在使用YamlSnake库

Person.java

public class Person
{

    int id;
    String fname;
    String lname;
    int age;

    public Person(int id, String fname, String lname, int age)
    {

        this.id = id;
        this.fname = fname;
        this.lname = lname;
        this.age = age;
    }
}
@Override
public ArrayList<Person> Read() {

    ArrayList<Person> pp = new ArrayList<Person>();
    try 
    {
        FileReader fr = new FileReader("d:\\Person.yml");
        BufferedReader br = new BufferedReader(fr);
        String str=br.readLine();
        Yaml yml = new Yaml();
        pp=(ArrayList<Person>) yml.load(str);
        fr.close();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return pp;
}
yaml.java

public class Person
{

    int id;
    String fname;
    String lname;
    int age;

    public Person(int id, String fname, String lname, int age)
    {

        this.id = id;
        this.fname = fname;
        this.lname = lname;
        this.age = age;
    }
}
@Override
public ArrayList<Person> Read() {

    ArrayList<Person> pp = new ArrayList<Person>();
    try 
    {
        FileReader fr = new FileReader("d:\\Person.yml");
        BufferedReader br = new BufferedReader(fr);
        String str=br.readLine();
        Yaml yml = new Yaml();
        pp=(ArrayList<Person>) yml.load(str);
        fr.close();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return pp;
}

您的YAML语法有错误。在块映射中,每行只允许一个键。另外,在
-
之后必须有空格,才能将它们识别为YAML特殊字符。尝试:

- id: 2
  fname: uu
  lname: uu
  age: 45
如果要将其保持在一行中,可以使用流程图:

- {id: 2, fname: uu, lname: uu, age: 45 }
第二个问题是类型擦除。您不能告诉SnakeYaml将YAML序列加载到
ArrayList
中,因为在运行时,即使告诉SnakeYaml您想要一个
ArrayList
,也无法确定泛型参数
Person
。然而,SnakeYaml确实提供了克服这一限制的可能性——唉,它要求您更改YAML

让这成为你的YAML:

persons:
- id: 2
  fname: uu
  lname: uu
  age:45
注意,我将一个YAML映射作为根元素,它只包含一个键
persons
,其值是原始YAML

现在,在Java中,声明一个与此根元素匹配的类:

class Root {
    List<Person> persons;
}

请注意上面代码中的错误,我没有对其进行测试。

很难判断您的YAML是否有错误,或者这是否是由于在此处设置帖子格式方面缺乏经验所致。请查看其他帖子(您可以编辑并取消它们),以了解如何获得格式更好的帖子。我还建议你找一个更精通英语的人来复习你的课文。我更容易理解这篇文章,它有更好的机会得到高质量的答案。