我试图使用SnakeYaml在Java中创建字符串和对象的映射。
有一个 Person.java 类,用于存储有关某人的信息。我想从yaml文件中读取有关每个人的信息,并将其存储在地图中,其中键是人名,值是人物对象。 即。对于每个人名,必须创建人物对象并将其添加到地图中。
编辑:
YAML反序列化应创建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不支持这种类型的反序列化吗? 任何关于为什么会出现这个问题以及如何解决这个问题的帮助都非常感激。
答案 0 :(得分:0)
在我看来,您的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的专家,但要将数据解码为自定义bean,请查看此处:https://code.google.com/p/snakeyaml/wiki/Documentation#JavaBeans
答案 1 :(得分:0)
你需要添加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;
}
}
答案 2 :(得分:0)
更改此:
Yaml yaml = new Yaml();
收件人:
Yaml yaml = new Yaml(new Constructor(Person.class));