2014-10-19 87 views
2

我试图使用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不支持的反序列化类型? 为什么会出现这个问题以及如何解决这个问题的任何帮助,非常感谢。

回答

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的专家,但解码数据到自定义豆,看看这里:https://code.google.com/p/snakeyaml/wiki/Documentation#JavaBeans

+0

是的,这是正确的,它得到的那样解码。但我希望它被创建为Map 而不是Map >。我会在我的问题中明确地加上这个。 – Balasubramanian 2014-10-19 12:50:33

+0

我编辑了我的回复,我添加了一个可以帮助你的链接 – ToYonos 2014-10-19 13:09:48

0

您需要添加集()和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; 
    } 
} 
相关问题