2

我想知道是否可以让snakeyaml 将yaml 文档加载到javabean 中,如果它无法找到文档中条目的匹配项作为javabean 属性,它将把它放入javabean 中的通用映射中。 ..

前任。

public class Person {
  private String firstName;
  private String lastName;
  private Map<String, Object> anythingElse;

  //Getters and setters...
}

如果我加载一个看起来像这样的文档:

firstName: joe
lastName: smith
age: 30

由于年龄不是 bean 中的属性,我希望将 {age, 30} 添加到anythingElse 地图中。

可能的?

谢谢。

4

3 回答 3

0

不,这是不可能的。

根据我的经验和尝试,它不起作用。如果您想将文件加载到对象中,那么该对象类中的所有属性都必须具有 getter 和 setter(IE 类必须是 JavaBean,请参阅 Wikipedia)。

我使用了您的 Person 类(有关正确的 JavaBeanClass,请参见 wiki 页面)和此代码:http ://codepaste.net/dbtzqb

我的错误消息是:“第 3 行,第 4 列:无法在类:Person 上找到属性 'age' ”,从而证明这个简单的程序不能具有“意外”属性。这是我快速而简单的结论。我没有广泛尝试,所以它可能是可能的,但我不知道这样的方式(你必须绕过阅读方法和 JavaBean)。我使用过 YamlBeans ( https://code.google.com/p/yamlbeans/ ),所以它有点不同,但我发现它更容易工作;]

希望它有所帮助!

编辑

很抱歉碰到这个,迟到总比没有好!直到我发布答案后我才看到发布日期。但希望它可以帮助其他寻求帮助的人:3

于 2013-04-11T12:29:26.423 回答
0

我没有使用 SnakeYaml 尝试过以下(半笨拙的 hack),但我使用 YamlBeans 让它工作:

基本上,这个想法是定义一个扩展 java.util.Map 的具体实现之一的类。然后定义选择不同值的 getter 和返回其他所有内容的通用 getter:

public class Person extends HashMap<String, Object>
{
    public String getFirstName()
    {
        return (String)this.get("firstName");
    }

    public String getLastName()
    {
        return (String)this.get("lastName");
    }

    public Map<String, Object> getExtensions()
    {
        Map<String, Object> retVal = (Map<String, Object>)this.clone();

        retVal.remove("firstName");
        retVal.remove("lastName");

        return retVal;
    }
}

我不确定 SnakeYaml 或 YamlBeans 如何优先考虑您在反省此类时看到的不同类型信息,但 YamlBeans(至少)满足于将信息反序列化到此类中,就好像它是任何其他 Map 一样,并且似乎没有被加法吸气剂弄糊涂了(即不会在“getExtensions”上绊倒)。

于 2013-04-29T15:57:12.340 回答
-1

有可能的:

import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.representer.Representer;

public class YamlReader {
    public static <T> T readYaml(InputStream is, Class<T> clazz){
        Representer representer = new Representer();
        // Set null for missing values in the yaml
        representer.getPropertyUtils().setSkipMissingProperties(true);

        Yaml yaml = new Yaml(representer);
        T data = yaml.loadAs(is, clazz);

        return data;
    }
}
于 2016-05-25T06:11:10.460 回答