5

我试图使用 SnakeYaml 在 Java 中创建字符串和对象的映射。

有一个Person.java类用于存储有关人员的信息。我想从 yaml 文件中读取每个人的信息,并将其存储在地图中,人名Person 对象。IE。对于每个人名,必须创建一个人对象并将其添加到地图中。

编辑: YAML 反序列化应该创建一个Map<String, Person>

以下是每个文件的内容:

YAML 文件:

PersonName1: 
  value1: foo1
  value2: bar1
  value3: foobar1

PersonName2:
  value1: foo2
  value2: bar2
  value3: foobar2

人.java

public class Person {
    public String value1;
    public String value2;
    public String value3;
}

主.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 不支持这种类型的反序列化吗?非常感谢您对为什么会出现此问题以及如何解决此问题提供任何帮助。

4

3 回答 3

1

改变这个:

Yaml yaml = new Yaml();

至:

Yaml yaml = new Yaml(new Constructor(Person.class));

这是如何使用 SnakeYaml 的一个很好的示例: https ://aqaexplorer.com/2019/12/10/parsing-yaml-with-snake-yaml/

于 2019-12-05T14:12:25.137 回答
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

于 2014-10-19T12:35:06.963 回答
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;
    }
}
于 2017-03-03T13:46:05.213 回答