Java 用Jackson写yaml?

Java 用Jackson写yaml?,java,json,jackson,yaml,Java,Json,Jackson,Yaml,我正在使用Jackson读取和修改yaml文件。效果很好。不过,我找不到写yaml所需的魔法咒语 ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); ObjectNode root = (ObjectNode)mapper.readTree(yamlFileIn); // modify root here mapper.writeValue(yamlFileOut, root); // writes json, not yaml.

我正在使用Jackson读取和修改yaml文件。效果很好。不过,我找不到写yaml所需的魔法咒语

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
ObjectNode root = (ObjectNode)mapper.readTree(yamlFileIn);
// modify root here
mapper.writeValue(yamlFileOut, root); // writes json, not yaml. not sure why.
我相信这是作家、JsonGenerators和其他一些东西的结合。有人得到示例代码吗?

试试:

YAMLFactory yf = new YAMLFactory();
ObjectMapper mapper = new ObjectMapper(yf);
ObjectNode root = (ObjectNode) mapper.readTree(yamlFileIn);
// modify root here     
FileOutputStream fos = new FileOutputStream(yamlFileOut);
yf.createGenerator(fos).writeObject(root); // works. yay.

对于v2.8.3,以下各项应适用:

YAMLFactory yf = new YAMLFactory();
ObjectMapper mapper = new ObjectMapper(yf);
ObjectNode root = (ObjectNode) mapper.readTree(yamlFileIn);
// modify root here     
FileOutputStream fos = new FileOutputStream(yamlFileOut);
SequenceWriter sw = mapper.writerWithDefaultPrettyPrinter().writeValues(fos);
sw.write(root);

如图所示的代码应该可以工作——可能有bug。确保使用最新版本(2.4.4)。
YAMLFactory
可能缺少某些覆盖,导致意外使用JSON生成器。FWIW,2.1.3中修复的问题12()可能已描述。请注意,对于v2.8.3,此答案可能会产生异常
没有为生成器定义ObjectCodec
。使用映射器写入值似乎是首选解决方案。@dave jarvis关于v2.8.3的说法是正确的。这将产生“没有为生成器定义ObjectCodec…”异常。@DaveJarvis gilbertpilz上面的回答有解决方法:是的,这适用于Jackson的最新版本。另一个没有。它的优越性在于,如果您也在读取文件,则可以重用已经配置的mapper/yamlfactory。