Snakeyaml加载到JavaBean,如果找不到属性,则放在map中

时间:2012-07-27 16:11:20

标签: java yaml snakeyaml

我想知道是否有可能让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

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

可能的?

感谢。

3 个答案:

答案 0 :(得分:0)

不,这是不可能的。

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

我使用了您的Person类(请参阅维基页面以获取正确的JavaBeanClass)和此代码:http://codepaste.net/dbtzqb

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

希望它有所帮助!

修改

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

答案 1 :(得分:0)

我没有使用SnakeYaml尝试以下(半kludgy 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并且没有似乎被添加的getter弄糊涂了(即不会在“getExtensions”上绊倒)。

答案 2 :(得分:-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;
    }
}