2013-07-12 39 views
97

Ngay bây giờ tôi có một phiên bản org.fasterxml.jackson.databind.ObjectMapper và muốn nhận được String với JSON đẹp. Tất cả các kết quả tìm kiếm trên Google của tôi đã đưa ra các cách thức làm việc của Jackson 1.x và dường như tôi không thể tìm ra cách thực hiện điều này một cách thích hợp, không được chấp nhận với 2.2. Mặc dù tôi không tin mã số đó là hoàn toàn cần thiết cho câu hỏi này, đây là những gì tôi có ngay bây giờ:JSON in đẹp từ ObjectMapper của Jackson 2.2

ObjectMapper mapper = new ObjectMapper(); 
mapper.setSerializationInclusion(Include.NON_NULL); 
System.out.println("\n\n----------REQUEST-----------"); 
StringWriter sw = new StringWriter(); 
mapper.writeValue(sw, jsonObject); 
// Want pretty version of sw.toString() here 

Trả lời

196

Bạn có thể bật khá-in bằng cách thiết lập SerializationFeature.INDENT_OUTPUT trên của bạn ObjectMapper như vậy:

mapper.enable(SerializationFeature.INDENT_OUTPUT); 
+0

Tôi cũng đã thử điều này nhưng có vẻ như 'SerializationConfig' được giải quyết nhưng' SerializationConfig.Feature' thì không.Điều này có vẻ là một phương pháp in đẹp khác cũng không được chấp nhận trừ khi tôi bỏ sót điều gì đó. Có một lớp 'Feature' được tách riêng ra, nhưng không có hằng số' INDENT_OUTPUT' bên trong. :( –

+0

@Anthony Atkinson - Tôi đã chỉnh sửa câu trả lời cho Jackson2. – gregwhitaker

+0

Tuyệt vời! Tôi rất muốn biết cách bạn tìm thấy điều đó;) –

29

Theo mkyong, câu thần chú ma thuật là defaultPrintingWriter-pretty print JSON:

Mới hơn phiên bản:

System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonInstance)); 

phiên bản cũ:

System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(jsonInstance)); 

Dường như tôi đã nhảy nhanh lên một chút. Bạn có thể thử gson, mà constructor supports pretty-printing:

Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
String jsonOutput = gson.toJson(someObject); 

Hope this helps ...

+0

tôi tìm thấy bài viết này và đã thất vọng khi thấy rằng đây là một trong những cách phản đối của in ấn đẹp. 'defaultPrettyPrintingWriter()' không còn có sẵn (thậm chí là một phương thức không được chấp nhận nữa) trên lớp 'ObjectMapper'. –

+0

Tôi đã thực sự suy nghĩ về việc này, nhưng ứng dụng của tôi đã được định hướng rất nhiều Jackson và tất cả các chức năng thực sự là hoàn thành. Máy chủ ứng dụng web mà máy chủ này sẽ được lưu trữ trên đã bị đánh thuế khá nhiều và tôi sẽ không muốn tải các thư viện bổ sung chỉ đơn giản là yêu cầu và phản hồi ghi nhật ký. Tôi chắc chắn sẽ bỏ phiếu cho câu trả lời của bạn. –

+5

@AnthonyAtkinson trong Jackson 2.3 có một phương thức 'ObjectMapper.writerWithDefaultPrettyPrinter()' –

-7

Hãy thử điều này .

objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT); 
+9

Sao chép câu trả lời đã chọn sau 7 tháng không thực sự hữu ích. –

+1

có thể hữu ích cho một số như tôi đã đề cập trong một dòng, tôi cảm thấy tốt trong việc chia sẻ bất cứ điều gì tôi biết. –

2

các IDENT_OUTPUT đã không làm bất cứ điều gì đối với tôi, và đưa ra một câu trả lời hoàn chỉnh làm việc với tôi jackson 2.2.3 lọ:

public static void main(String[] args) throws IOException { 

byte[] jsonBytes = Files.readAllBytes(Paths.get("C:\\data\\testfiles\\single-line.json")); 

ObjectMapper objectMapper = new ObjectMapper(); 

Object json = objectMapper.readValue(jsonBytes, Object.class); 

System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(json)); 
} 
0

Nếu bạn muốn tắt chức năng này theo mặc định cho TẤT CẢ ObjectMapper trường hợp trong một quá trình, đây là một ít hack mà sẽ thiết lập giá trị mặc định của INDENT_OUTPUT true:

val indentOutput = SerializationFeature.INDENT_OUTPUT 
val defaultStateField = indentOutput.getClass.getDeclaredField("_defaultState") 
defaultStateField.setAccessible(true) 
defaultStateField.set(indentOutput, true) 
22

các jackson API đã thay đổi:

new ObjectMapper() 
.writer() 
.withDefaultPrettyPrinter() 
.writeValueAsString(new HashMap<String, Object>()); 
+2

Vẫn có thể (với Jackson 2.7.6) sử dụng 'ObjectMapper mới(). Configure (SerializationFeature.INDENT_OUTPUT, true) .writer(). WriteValueAsString (new HashMap ());'. Bạn chỉ cần đảm bảo sử dụng trình soạn thảo bạn nhận được từ cấu hình 'ObjectMapper'. – Martin

0

nếu bạn đang sử dụng kết hợp mùa xuân và jackson, bạn có thể làm như sau. Tôi đang theo dõi @ gregwhitaker như được đề xuất nhưng thực hiện theo phong cách mùa xuân.

<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"> 
    <property name="dateFormat"> 
     <bean class="java.text.SimpleDateFormat"> 
      <constructor-arg value="yyyy-MM-dd" /> 
      <property name="lenient" value="false" /> 
     </bean> 
    </property> 
    <property name="serializationInclusion"> 
     <value type="com.fasterxml.jackson.annotation.JsonInclude.Include"> 
      NON_NULL 
     </value> 
    </property> 
</bean> 

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject"> 
     <ref bean="objectMapper" /> 
    </property> 
    <property name="targetMethod"> 
     <value>enable</value> 
    </property> 
    <property name="arguments"> 
     <value type="com.fasterxml.jackson.databind.SerializationFeature"> 
      INDENT_OUTPUT 
     </value> 
    </property> 
</bean> 
Các vấn đề liên quan