【问题标题】:Avoid the JavaBean Root Tags in SnakeYaml dumping避免 SnakeYaml 转储中的 JavaBean 根标记
【发布时间】:2014-12-18 09:05:55
【问题描述】:

当我转储以下类的实例时:

class BrooklynApplicationEntity{
    private String id;
    private String location;
    private String name;
    List<BrooklynServiceEntity> services;

    //getters and setters
    ...
}

使用下一个代码:

 DumperOptions options = new DumperOptions();
 options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
 options.setCanonical(false);
 options.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN);
 SkipEmptyAndNullRepresenter skipEmptyAndNullRepresenter=
     new SkipEmptyAndNullRepresenter();

 Yaml yaml=new Yaml(skipEmptyAndNullRepresenter, options);
 yaml.dump(this.getBrooklynApplicationEntity(), file);

我获取下一个yaml。

!!org.tomat.translate.brooklyn.entity.BrooklynApplicationEntity
id: dbApp
location: localhost
name: DatabaseApp
services:
- !!org.tomat.translate.brooklyn.entity.JBossBrooklynService
  brooklynConfigProperties:
    port.http: 80+
  id: JBossMainWebServer
  location: AWS
  name: JBoss Main Web Server
- !!org.tomat.translate.brooklyn.entity.JBossBrooklynService
  id: JBossSecondWebServer
  location: localhost
  name: JBoss

我想避免输出 YAML 中的 TAG,所以我添加了下一条指令, 在How to hide bean type in snakeyamlImplicitTagsTest 中是如何描述的。

    skipEmptyAndNullRepresenter.addClassTag(JBossAgnosticElement.class, Tag.MAP);
    skipEmptyAndNullRepresenter.addClassTag(JBossAgnosticElement.class, Tag.SEQ);

但是,标签!!org.tomat.translate.brooklyn.entity.BrooklynApplicationEntity!!org.tomat.translate.brooklyn.entity.JBossBrooklynService 不会被删除。

【问题讨论】:

    标签: java yaml dump snakeyaml


    【解决方案1】:

    我已经解决了这个问题。 当我向一个类添加一个隐式标签(例如 TAG.Map)时,我必须使用完整的类名。 例如,为了避免!!org.tomat.translate.brooklyn.entity.JBossAgnosticElement,需要下一条指令。

    skipEmptyAndNullRepresenter.addClassTag(
        org.tomat.translate.brooklyn.entity.JBossAgnosticElement.class, Tag.MAP);
    

    而不是

    skipEmptyAndNullRepresenter.addClassTag(JBossAgnosticElement.class, Tag.MAP);
    

    【讨论】:

    • 看来你打错了JBossAgnosticElement。通过正确的导入,它可以完美地工作,而无需使用完全限定的类名。使用正确的导入,这些语句也将完全等效。
    【解决方案2】:
     //write seperate function to remove tag comments !!sometest.Trades from the yaml file as it will cause issue while reading it
                Representer representer = new Representer() {
                    @Override
                    protected NodeTuple representJavaBeanProperty(Object javaBean, Property property, Object propertyValue, Tag customTag) {
                        // if value of property is null, ignore it.
                        if (int.class.equals(property.getType())) {
                            return null;
                        } else {
                            return super.representJavaBeanProperty(javaBean, property, propertyValue, customTag);
                        }
                    }
                };
                representer.addClassTag(sometest.Trades.class, Tag.MAP);
                Yaml yaml1 = new Yaml(representer, options);
     Writer output;
                output = new BufferedWriter(new FileWriter(outputFilePath, true));
                yaml1.dump(trades, output);
                output.close();
    

    【讨论】:

      猜你喜欢
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 2012-05-10
      • 2023-03-22
      • 1970-01-01
      • 2012-09-21
      • 2019-08-11
      相关资源
      最近更新 更多