2015-01-31 18 views
8

Tôi thực sự đang phải vật lộn với mức độ phức tạp mà tôi cảm thấy trong việc giải quyết vấn đề này. Như tiêu đề cho biết: Cách đơn giản để tạo một chiếc Jackson ObjectMapper với 4-space PrettyPrinter là gì?Cách đơn giản nhất để cấu hình khoảng cách thụt lề trên một đối tượng Jackson là gì?

Điểm thưởng: Làm thế nào tôi có thể sửa đổiObjectMapper hiện có để làm cho nó in đẹp 4 không gian?

Qua nghiên cứu của tôi, tôi đã tìm thấy rằng cách đơn giản nhất là để cho phép in ấn khá thường là để thiết lập INDENT_OUTPUT trên mapper:

objectMapper.enable(SerializationFeature.INDENT_OUTPUT); 

Tuy nhiên, điều này chỉ cho phép các DefaultPrettyPrinter, trong đó có 2 không gian thụt đầu dòng. Tôi muốn 4. Để làm điều này, có vẻ như tôi phải xây dựng ObjectMapper của riêng mình, cung cấp JsonFactory với một JsonGenerator có một không gian PrettyPrinter có 4 dấu cách. Đây là cách quá mãnh liệt đối với một thứ gì đó quá đơn giản trên các nền tảng khác. Hãy cho tôi biết có một cách đơn giản hơn.

+0

Đây là vấn đề mát mẻ. Chỉ cần tò mò, là hành vi này mong muốn cho lý do hoàn toàn mỹ phẩm hoặc là có thực sự là một hạn chế ở đâu đó đó là đòi hỏi bạn phải sử dụng 4 thụt lề không gian? –

+0

Tôi đã thử đặt một cái gì đó _real_ khó chịu cùng với sự phản ánh và quyết định nó có lẽ thậm chí không hài hước. Tôi nghĩ ý tưởng đằng sau sự bối rối là: nó cũng không kém phần quan trọng bất kể cấu hình của bạn phức tạp như thế nào. Bạn có thể sẽ cần phải làm theo các phương pháp Jackson quy định để áp dụng này trên toàn cầu trên người lập bản đồ hiện tại của bạn (sadpanda) –

+0

Hi Sam. Cảm ơn bạn đã suy nghĩ về điều này. Tôi đoán ràng buộc sử dụng-case cho tôi là mỹ phẩm đáp ứng thực tế đáp ứng què: Tôi đã cố gắng để đăng nhập các nội dung của một đồ thị bằng cách sử dụng mô-đun GraphSON được cung cấp trong Tinkerpop3. Gỡ lỗi đăng nhập JSON là hữu ích nhất đối với tôi khi có rất nhiều thụt đầu dòng. Đây là câu hỏi gốc: http://stackoverflow.com/questions/28255878/can-i-customize-a-jackson-objectmapper-by-adding-a-module –

Trả lời

9

Tôi không chắc đây có phải là cách đơn giản nhất nhưng ... Bạn có thể sử dụng ObjectMapper bằng máy in tùy chỉnh. Bạn có thể sử dụng DefaultPrettyPrinter nếu bạn sửa đổi hành vi thụt lề.

// Create the mapper 
ObjectMapper mapper = new ObjectMapper(); 

// Setup a pretty printer with an indenter (indenter has 4 spaces in this case) 
DefaultPrettyPrinter.Indenter indenter = 
     new DefaultIndenter(" ", DefaultIndenter.SYS_LF); 
DefaultPrettyPrinter printer = new DefaultPrettyPrinter(); 
printer.indentObjectsWith(indenter); 
printer.indentArraysWith(indenter); 

// Some object to serialize 
Map<String, Object> value = new HashMap<>(); 
value.put("foo", Arrays.asList("a", "b", "c")); 

// Serialize it using the custom printer 
String json = mapper.writer(printer).writeValueAsString(value); 

// Print it 
System.out.println(json); 

Kết quả sẽ là:

{ 
    "foo" : [ 
     "a", 
     "b", 
     "c" 
    ] 
} 
+0

Cảm ơn bạn. Tôi đã bỏ lỡ một vài điều mà bạn chỉ ra ở đây. –

+0

Bạn có thể sử dụng 'mapper.setDefaultPrettyPrinter (máy in);' để làm cho máy in tùy chỉnh trong câu trả lời này là mặc định cho trình ánh xạ đối tượng của bạn. Bạn vẫn cần phải kích hoạt thụt lề thông qua 'mapper.enable (SerializationFeature.INDENT_OUTPUT)'. – Towler

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