Java SnakeYaml-反序列化为字符串和自定义对象映射时的ClassCastException

Java SnakeYaml-反序列化为字符串和自定义对象映射时的ClassCastException,java,deserialization,snakeyaml,Java,Deserialization,Snakeyaml,我试图使用SnakeYaml在Java中创建字符串和对象的映射 有一个Person.java类用于存储关于某人的信息。我想从yaml文件中读取每个人的信息,并将其存储在地图中,其中键为人名,值为人名对象。 例如,对于每个人名,必须创建一个person对象并将其添加到地图中 编辑: YAML反序列化应该创建一个映射 以下是每个文件的内容: YAML文件: PersonName1: 值1:foo1 值2:bar1 价值3:foobar1 人名2: 价值1:2 值2:bar2 价值3:foobar2

我试图使用SnakeYaml在Java中创建字符串和对象的映射

有一个Person.java类用于存储关于某人的信息。我想从yaml文件中读取每个人的信息,并将其存储在地图中,其中键为人名值为人名对象。 例如,对于每个人名,必须创建一个person对象并将其添加到地图中

编辑: YAML反序列化应该创建一个
映射

以下是每个文件的内容:

YAML文件:

PersonName1:
值1:foo1
值2:bar1
价值3:foobar1
人名2:
价值1:2
值2:bar2
价值3:foobar2
Person.java

public class Person {
    public String value1;
    public String value2;
    public String value3;
}
public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        InputStream inputStream = new FileInputStream(new File("SampleYamlFile.yml"));
        Yaml yaml = new Yaml();

        Map<String, Person> persons = (Map<String, Person>) yaml.load(inputStream);
        for(String key : persons.keySet()) {
            System.out.println("key = " + key);
            Person person = persons.get(key);
            System.out.println("person = " + person);
        }
    }
}
Main.java

public class Person {
    public String value1;
    public String value2;
    public String value3;
}
public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        InputStream inputStream = new FileInputStream(new File("SampleYamlFile.yml"));
        Yaml yaml = new Yaml();

        Map<String, Person> persons = (Map<String, Person>) yaml.load(inputStream);
        for(String key : persons.keySet()) {
            System.out.println("key = " + key);
            Person person = persons.get(key);
            System.out.println("person = " + person);
        }
    }
}
公共类主{
公共静态void main(字符串[]args)引发FileNotFoundException{
InputStream InputStream=新文件InputStream(新文件(“SampleYamlFile.yml”);
Yaml Yaml=新的Yaml();
映射人员=(映射)yaml.load(输入流);
for(字符串键:persons.keySet()){
System.out.println(“key=“+key”);
Person=persons.get(键);
System.out.println(“person=“+person”);
}
}
}
创建映射时没有任何错误。 钥匙也会被打印出来。 但是当我试图访问键的值时,我得到了一个ClassCastException

java.lang.ClassCastException:无法强制转换java.util.LinkedHashMap 对人

SnakeYaml是否不支持这种类型的反序列化?
非常感谢您对出现此问题的原因以及如何解决此问题的任何帮助。

我认为,您的Yaml文件已在以下结构中解码:

Map<String, Map<String, String>>
Map
您可以尝试以下方法:

Map<String, Map<String, String>> persons = (Map<String, Map<String, String>>).yaml.load(inputStream);
for(String key : persons.keySet())
{
    System.out.println("key = " + key);
    Map<String, String> personValues = persons.get(key);
    for (String valueKey : personValues.keySet())
    {
        System.out.println(valueKey + " = " + personValues.get(valueKey));
    }
}
Map persons=(Map).yaml.load(inputStream);
for(字符串键:persons.keySet())
{
System.out.println(“key=“+key”);
Map personValues=persons.get(键);
for(字符串valueKey:personValues.keySet())
{
System.out.println(valueKey+“=”+personValues.get(valueKey));
}
}
编辑

我不是Yaml的专家,但要将数据解码为自定义bean,请看这里:

您需要添加set()和get(),如下所示:

public class Person {
    public String value1;
    public String value2; 
    public String value3;

    public String getValue1() {
        return value1;
    }

    public void setValue1(String value1) {
        this.value1 = value1;
    }

    public String getValue2() {
        return value2;
    }

    public void setValue2(String value2) {
        this.value2 = value2;
    }

    public String getValue3() {
        return value3;
    }

    public void setValue3(String value3) {
        this.value3 = value3;
    }
}
更改此项:

Yaml yaml = new Yaml();
致:

下面是如何使用SnakeYaml的一个很好的示例:

是的,没错,就是这样解码的。但我希望它被创建为一张地图,而不是一张地图。我将在我的问题中明确地补充这一点。