SnakeYaml 中的多态集合
Polymorphic collections in SnakeYaml
我的意图是使用 jackson 获得像 JSON 中的那样的多态集合,也许借助标签。
我似乎无法正确配置它。
我的 yaml 文件是:
!person
age: 27
job: dev
name: me
skills:
- !devSkill {
description: 'software development',
name: android,
language: java, c++
years: 7
}
- !softSkill {
description: 'good person',
name: <3,
reason: lots of NGO work
}
- !sportsSkill {
description: 'racing legend',
name: vrooom,
championships: - San Marino 2012
- San Marino 2015
}
代码中的哪一个将映射到具有(抽象?)BaseSkill 的层次结构,其中包含描述和名称,以及 3 children:dev、soft 和 sports。
我的问题是,我对 SnakeYAML 的文档了解不够,无法允许这样做。我目前的选择是:
Constructor constructor = new Constructor(Person.class);
TypeDescription carDescription = new TypeDescription(Person.class);
carDescription.putListPropertyType("skills", SportsSkill.class);
carDescription.putListPropertyType("skills", SoftSkill.class);
carDescription.putListPropertyType("skills", DevSkill.class);
// Apparently the last is the winner here because it overrides
constructor.addTypeDescription(carDescription);
Representer representer = new Representer();
representer.addClassTag(Person.class, new Tag("!person"));
representer.addClassTag(SoftSkill.class, new Tag("!Softkill"));
representer.addClassTag(DevSkill.class, new Tag("!devSkill"));
representer.addClassTag(SportsSkill.class, new Tag("!portsSkill"));
DumperOptions options = new DumperOptions();
options.setPrettyFlow(true);
Yaml yaml = new Yaml(constructor, representer, options);
错误在
行
E/YAML﹕ Can't construct a java object for tag:yaml.org,2002:app.yamlmodel.Person; exception=Cannot create property=skills for JavaBean=Person(name=me, job=dev, age=27, skills=null); null; Can't construct a java object for !sportSkill; exception=Invalid tag: !sportSkill
in "<reader>", line 1, column 1:
name: me
^
这个帖子已经过时了,但我找到了解决方案,希望它仍然对某人有所帮助。
你的错误是你应该将标签和类型描述符添加到构造函数并让 SnakeYaml 找出对象结构。
在你的情况下:
Constructor constructor = new Constructor(Person.class);
constructor.addTypeDescription(new TypeDescription(SoftSkill.class, new Tag("!softkill"));
constructor.addTypeDescription(new TypeDescription(DevSkill.class, new Tag("!devkill"));
constructor.addTypeDescription(new TypeDescription(SportsSkill.class, new Tag("!sportskill"));
你没有提到你使用的 SnakeYaml 版本,但我使用的是 1.16
我的意图是使用 jackson 获得像 JSON 中的那样的多态集合,也许借助标签。
我似乎无法正确配置它。
我的 yaml 文件是:
!person
age: 27
job: dev
name: me
skills:
- !devSkill {
description: 'software development',
name: android,
language: java, c++
years: 7
}
- !softSkill {
description: 'good person',
name: <3,
reason: lots of NGO work
}
- !sportsSkill {
description: 'racing legend',
name: vrooom,
championships: - San Marino 2012
- San Marino 2015
}
代码中的哪一个将映射到具有(抽象?)BaseSkill 的层次结构,其中包含描述和名称,以及 3 children:dev、soft 和 sports。
我的问题是,我对 SnakeYAML 的文档了解不够,无法允许这样做。我目前的选择是:
Constructor constructor = new Constructor(Person.class);
TypeDescription carDescription = new TypeDescription(Person.class);
carDescription.putListPropertyType("skills", SportsSkill.class);
carDescription.putListPropertyType("skills", SoftSkill.class);
carDescription.putListPropertyType("skills", DevSkill.class);
// Apparently the last is the winner here because it overrides
constructor.addTypeDescription(carDescription);
Representer representer = new Representer();
representer.addClassTag(Person.class, new Tag("!person"));
representer.addClassTag(SoftSkill.class, new Tag("!Softkill"));
representer.addClassTag(DevSkill.class, new Tag("!devSkill"));
representer.addClassTag(SportsSkill.class, new Tag("!portsSkill"));
DumperOptions options = new DumperOptions();
options.setPrettyFlow(true);
Yaml yaml = new Yaml(constructor, representer, options);
错误在
行E/YAML﹕ Can't construct a java object for tag:yaml.org,2002:app.yamlmodel.Person; exception=Cannot create property=skills for JavaBean=Person(name=me, job=dev, age=27, skills=null); null; Can't construct a java object for !sportSkill; exception=Invalid tag: !sportSkill
in "<reader>", line 1, column 1:
name: me
^
这个帖子已经过时了,但我找到了解决方案,希望它仍然对某人有所帮助。 你的错误是你应该将标签和类型描述符添加到构造函数并让 SnakeYaml 找出对象结构。 在你的情况下:
Constructor constructor = new Constructor(Person.class);
constructor.addTypeDescription(new TypeDescription(SoftSkill.class, new Tag("!softkill"));
constructor.addTypeDescription(new TypeDescription(DevSkill.class, new Tag("!devkill"));
constructor.addTypeDescription(new TypeDescription(SportsSkill.class, new Tag("!sportskill"));
你没有提到你使用的 SnakeYaml 版本,但我使用的是 1.16