2015-01-01 15 views
6

Tôi đang sử dụng Jackson để đọc và sửa đổi các tệp yaml. Hoạt động tuyệt vời. Tôi không thể tìm thấy những câu thần chú cần thiết để viết yaml.Sử dụng Jackson để viết 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. 

Tôi chắc chắn đó là sự kết hợp giữa các nhà văn, JsonGenerators và một số thứ khác. Bất cứ ai có mã mẫu?

+1

Mã như đã nêu nên làm việc - có thể có một lỗi. Đảm bảo sử dụng phiên bản gần đây (2.4.4). Có thể là 'YAMLFactory' có thể thiếu một số ghi đè, dẫn đến việc sử dụng ngẫu nhiên trình tạo JSON. – StaxMan

+0

FWIW, số phát hành 12 (https://github.com/FasterXML/jackson-dataformat-yaml/issues/12) đã được sửa trong 2.1.3 có thể có vấn đề được mô tả. – StaxMan

Trả lời

1

Hãy thử:

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

Lưu ý rằng với v2.8.3 câu trả lời này có thể tạo ra ngoại lệ 'No ObjectCodec được định nghĩa cho bộ tạo'. Sử dụng trình ánh xạ để viết giá trị có vẻ là giải pháp ưu tiên. –

+0

@ dave-jarvis là chính xác về v2.8.3. Điều này sẽ tạo ra 'No ObjectCodec được định nghĩa cho máy phát điện ..' ngoại lệ. – gilbertpilz

+0

@DaveJarvis câu trả lời của gilbertpilz ở trên có sửa chữa cho nó: http://stackoverflow.com/a/39732593/467240 – mtyson

3

Đối v2.8.3 sau nên làm việc:

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

Vâng, điều này làm việc cho các phiên bản gần đây của Jackson. Cái kia thì không. Nó là cấp trên, bởi vì bạn có thể tái sử dụng trình ánh xạ đã được cấu hình/yamlfactory nếu bạn cũng đọc các tệp. – mtyson

Các vấn đề liên quan