我试图使用SnakeYaml在Java中创建字符串和对象的映射。
有一个Person.java类用于存储关于一个人的信息。我想从yaml文件中读取每个人的信息,并将其存储在一个映射中,键是人名,值是Person对象。即对于每个人名,都必须创建一个人对象并添加到映射中。
编辑:YAML反序列化应该创建一个Map
以下是每个文件的内容:
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不能强制转换为Person
SnakeYaml不支持这种类型的反序列化吗?非常感谢有关为什么会出现此问题以及如何解决此问题的任何帮助。
改变这个:
Yaml yaml = new Yaml();
到:
Yaml yaml = new Yaml(new Constructor(Person.class));
以下是如何使用SnakeYaml的一个很好的例子:https://aqaexplorer.com/2019/12/10/parsing-yaml-with-snake-yaml/
在我看来,您的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
您需要添加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;
}
}