2015-01-01 7 views
6

Sto usando Jackson per leggere e modificare i file yaml. Funziona alla grande. Non riesco a trovare gli incantesimi magici necessari per scrivere lo yaml, però.Usa Jackson per scrivere 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. 

Sono sicuro che è una combinazione di scrittori, JsonGenerator e qualcos'altro. Qualcuno ha il codice di esempio?

+1

Il codice come indicato dovrebbe funzionare - forse c'è un errore. Assicurati di utilizzare una versione recente (2.4.4). È possibile che 'YAMLFactory' possa mancare qualche override, portando all'uso accidentale del generatore JSON. – StaxMan

+0

FWIW, numero 12 (https://github.com/FasterXML/jackson-dataformat-yaml/issues/12) corretto in 2.1.3 potrebbe avere problemi descritti. – StaxMan

risposta

1

Prova:

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

Si noti che con v2.8.3 questa risposta potrebbe produrre l'eccezione "Nessun ObjectCodec definito per il generatore". Usare il mapper per scrivere il valore sembra essere la soluzione preferita. –

+0

@ dave-jarvis è corretto sulla v2.8.3. Ciò produrrà l'eccezione "Nessun ObjectCodec definito per il generatore ..". – gilbertpilz

+0

@DaveJarvis risposta di gilbertpilz sopra ha la soluzione per questo: http://stackoverflow.com/a/39732593/467240 – mtyson

3

Per v2.8.3 il seguente dovrebbe funzionare:

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

Sì, questo funziona per le versioni recenti di Jackson. L'altro no. È superiore, perché puoi riutilizzare il mapper/yamlfactory già configurato se stai leggendo anche dei file. – mtyson

Problemi correlati