Khá in JSON từ ObjectMapper của Jackson 2.2


140

Ngay bây giờ tôi có một ví dụ org.fasterxml.jackson.databind.ObjectMappervà muốn có một StringJSON đẹ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 làm Jackson 1.x và tôi dường như không thể tìm thấy cách thức phù hợp, không bị phản đối trong việc này với 2.2. Mặc dù tôi không tin rằng mã 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ờ:

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

Câu trả lời:


276

Bạn có thể kích hoạt tính năng in đẹp bằng cách cài đặt như SerializationFeature.INDENT_OUTPUTtrên ObjectMapper:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

1
Tôi cũng đã thử điều này nhưng có vẻ như đã SerializationConfigđược giải quyết nhưng SerializationConfig.Featurekhông được. Đây dường như là một phương pháp in ấn đẹp khác cũng không được chấp nhận trừ khi tôi thiếu một cái gì đó. Có một Featurelớp riêng biệt, nhưng không có INDENT_OUTPUThằng số bên trong. :(
Anthony Atkinson

Thông minh! Tôi rất muốn biết làm thế nào bạn tìm thấy điều đó;)
Anthony Atkinson

1
Tôi đã xem xét một trong những dự án của mình, nhưng có vẻ như nó cũng ở đây: github.com/FasterXML/jackson-databind trong "Các tính năng thường được sử dụng"
gregwhitaker

Việc nhập có liên quan cần thiết là nhập com.fasterxml.jackson.databind. {SerializationFeature, ObjectMapper}
dgh

2
vào ngày 2.2.1, đây là những gì tôi cần: nhập org.codehaus.jackson.map.SerializationConfig.Feature; mapper.enable (Feature.INDENT_OUTPUT);
harschware 16/12/13

46

Theo mkyong , câu thần chú ma thuật là defaultPrintingWriterđể khá in JSON :

Phiên bản mới hơn:

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

Các phiên bản cũ hơn:

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

Có vẻ như tôi đã nhảy súng một cách nhanh chóng. Bạn có thể thử gson , công cụ xây dựng hỗ trợ in ấn đẹp :

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

Hi vọng điêu nay co ich...


1
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 không được chấp nhận trong việc in ấn đẹp. defaultPrettyPrintingWriter()không còn khả dụng (ngay cả khi là phương thức không dùng nữa) trên ObjectMapperlớp.
Anthony Atkinson

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

7
@AnthonyAtkinson ở Jackson 2.3 có một phương phápObjectMapper.writerWithDefaultPrettyPrinter()
matt b

36

API jackson đã thay đổi:

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

3
Vẫn có thể sử dụng (với Jackson 2.7.6) new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());. 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

3

IDENT_OUTPUT không làm gì cho tôi và để đưa ra câu trả lời hoàn chỉnh phù hợp với các bình cắm 2.2.3 của tôi:

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 bật tính năng này theo mặc định cho TẤT CẢ các phiên bản ObjectMapper trong một quy trình, thì đây là một bản hack nhỏ sẽ đặt giá trị mặc định của INDENT_OUTPUT thành true:

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

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ư đề 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>

0

Nếu những người khác xem câu hỏi này chỉ có một chuỗi JSON (không phải trong một đối tượng), thì bạn có thể đặt nó vào một HashMapvà vẫn làm ObjectMappercho nó hoạt động. Các resultbiến là chuỗi JSON của bạn.

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.Map;

// Pretty-print the JSON result
try {
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> response = objectMapper.readValue(result, HashMap.class);
    System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response));
} catch (JsonParseException e) {
    e.printStackTrace();
} catch (JsonMappingException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} 

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.