SnakeYaml - 将字符串和自定义对象映射到映射时发生ClassCastException
问题描述:
我试图使用SnakeYaml在Java中创建字符串和对象的映射。SnakeYaml - 将字符串和自定义对象映射到映射时发生ClassCastException
有一个Person.java类存储有关人的信息。我想从一个YAML文件中读取有关每个人的信息,并将其存储在与键作为人名和值作为Person对象地图。 即。对于每个人的名字,都必须创建一个人物并添加到地图中。
编辑: 的YAML deserialisation应该创建一个Map<String, Person>
下面是每个文件的内容:
YAML文件:
PersonName1:
value1: foo1
value2: bar1
value3: foobar1
PersonName2:
value1: foo2
value2: bar2
value3: foobar2
Person.java
public class Person {
public String value1;
public String value2;
public String value3;
}
Main.java
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);
}
}
}
的地图上被没有任何错误产生。 关键也被打印。 但是,当我尝试访问该键的值,我得到一个ClassCastException异常
java.lang.ClassCastException:java.util.LinkedHashMap中不能转换 以人
是这个SnakeYaml不支持的反序列化类型? 为什么会出现这个问题以及如何解决这个问题的任何帮助,非常感谢。
答
在我看来,你的YAML文件已被解码在这个结构中:
Map<String, Map<String, String>>
你可以试试这个:
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));
}
}
编辑
我不是Yaml的专家,但解码数据到自定义豆,看看这里:https://code.google.com/p/snakeyaml/wiki/Documentation#JavaBeans
答
您需要添加集()和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;
}
}
是的,这是正确的,它得到的那样解码。但我希望它被创建为Map而不是Map >。我会在我的问题中明确地加上这个。 –
Balasubramanian
2014-10-19 12:50:33
我编辑了我的回复,我添加了一个可以帮助你的链接 – ToYonos 2014-10-19 13:09:48