我想知道是否有可能让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}添加到anythingElse地图中。
可能的?
感谢。
答案 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;
}
}