java yaml dump方法_使用SnakeYaml将java对象写入文件 – 使用Yaml.dump()时不会写出内部对象列表...

我在使用SnakeYaml将

java对象写入yml文件时遇到问题.我已经设置了一个spring boot项目,其中包含一个简单的application.yml,我将其转换为一组java对象.在实际应用程序中添加了一些对象,当应用程序完成时,我想写出新的application.yml.

输入application.yml看起来像这样:

sample:

name: toyota

cars:

- model: prius

colour: silver

- model: avensis

colour: red

映射此application.yml的java对象:

@Configuration

@ConfigurationProperties(prefix="sample")

public class Config {

private String name;

private final List cars = new ArrayList<>();

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public List getCars() {

return cars;

}

}

以及写出yaml的示例类:

@Component

public class Example {

@Autowired

private Config config;

@PostConstruct

private void init(){

Yaml yaml = new Yaml();

StringWriter writer = new StringWriter();

yaml.dump(config, writer);

System.out.println(writer.toString());

}

}

输出只是:name:toyota(省略了一些yaml设置也被写出来).但是我希望输出与输入完全相同:

sample:

name: toyota

cars:

- model: prius

colour: silver

- model: avensis

colour: red

有没有办法做到这一点?

编辑:

用户flyx正确地指出了以下documentation.

我调整后的代码:

Constructor constructor = new Constructor(Config.class);

TypeDescription configDescription = new TypeDescription(Config.class);

configDescription.putListPropertyType("cars", Car.class);

constructor.addTypeDescription(configDescription);

Yaml yaml = new Yaml(constructor);

StringWriter writer = new StringWriter();

yaml.dump(config, writer);

System.out.println(writer.toString());

给出以下输出:

$$beanFactory: !!org.springframework.beans.factory.support.DefaultListableBeanFactory

allowBeanDefinitionOverriding: true

allowEagerClassLoading: true

autowireCandidateResolver: !!org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver {}

beanClassLoader: !!sun.misc.Launcher$AppClassLoader {}

beanExpressionResolver: !!org.springframework.context.expression.StandardBeanExpressionResolver {}

cacheBeanMetadata: true

conversionService: null

dependencyComparator: !!org.springframework.core.annotation.AnnotationAwareOrderComparator {}

parentBeanFactory: null

serializationId: application

tempClassLoader: null

typeConverter: !!org.springframework.beans.SimpleTypeConverter {conversionService: null}

name: toyota

最佳答案 由于类型擦除,SnakeYAML无法在运行时获取List的元素类型.该文档包含您需要做的

example.

这样的事情应该有效:

@PostConstruct

private void init(){

Constructor c = new Constructor(Config.class);

TypeDescription configD = new TypeDescription(Config.class);

configD.putListPropertyType("cars", Car.class);

c.addTypeDescription(configD);

Yaml yaml = new Yaml(c);

StringWriter writer = new StringWriter();

yaml.dump(config, writer);

System.out.println(writer.toString());

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值