2015-01-01 7 views
6

私はJacksonを使用してyamlファイルを読み取り、変更しています。よく働く。私は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、および他のもののいくつかの組み合わせだと確信しています。誰でもサンプルコードを手に入れましたか?

+1

コード示されているように動作するはずです - 多分バグがあります。最新バージョン(2.4.4)を使用してください。 'YAMLFactory'がいくつかのオーバーライドを失っている可能性があり、JSONジェネレータを誤って使用する可能性があります。 – StaxMan

+0

FWIW 2.1.3で修正された問題12(https://github.com/FasterXML/jackson-dataformat-yaml/issues/12)には、問題が説明されている可能性があります。 – StaxMan

答えて

1

試してみてください。以下は動作するはず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); 
yf.createGenerator(fos).writeObject(root); // works. yay. 
+1

v2.8.3では、この回答によって「Generatorに定義されたObjectCodecがありません」という例外が生成されることに注意してください。値を書き込むためにマッパーを使用する方が望ましい解決策のようです。 –

+0

@ dave-jarvisはv2.8.3について正しいです。これは、 'Generator ..のために定義されたNo ObjectCodec'例外を生成します。 – gilbertpilz

+0

@DaveJarvis gilbertpilzさんの答えは、上記の修正点があります:http://stackoverflow.com/a/39732593/467240 – mtyson

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); 
+0

これは最近のバージョンのジャクソンではうまくいきます。もう片方はしません。ファイルを読み込んでいる場合は、すでに設定されているマッパー/ yamlfactoryを再利用できるので、優れています。 – mtyson

関連する問題