2014-10-19 128 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; 
    } 
} 
相關問題