2014-10-19 3 views
2

Я пытался использовать SnakeYaml для создания карты строки и объектов в Java.SnakeYaml - ClassCastException при десериализации в карту строки и настраиваемых объектов

Существует Person.java класс для хранения информации о человеке. Я хотел, чтобы прочитать информацию о каждом человеке из файла YAML и хранить его в карте с ключом будет именем людей и значения быть объектом Person. т.е. Для каждого имени человека должен быть создан и добавлен объект на карту.

EDIT: 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

На мой взгляд, ваш файл 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

+0

Я отредактировал мой ответ, я добавил ссылку, которая могла бы помочь вам – ToYonos

0

Вам нужно добавить набор() и получить(), как это:

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; 
    } 
} 
Смежные вопросы