การพิมพ์ JSON ที่สวยงามด้วย Jackson ใน Java และ Spring Boot

Jackson เป็นหนึ่งในไลบรารี่ทั่วไปที่สุดสำหรับการทำงานกับการทำให้เป็นอนุกรมและการดีซีเรียลไลซ์เซชั่นใน Java และ Spring Boot ซึ่งส่วนใหญ่ใช้สำหรับการแยกวิเคราะห์และการแปลงระหว่าง POJO และ JSON

แม้ว่าถ้าคุณเคยร่วมงานกับแจ็คสัน คุณจะสังเกตเห็นว่าไม่มีการพิมพ์ที่สวยงามตามค่าเริ่มต้น:

{Task 1=In_Progress, Task 2=Done, Task 3=Planned}

ในบทช่วยสอนสั้นๆ นี้ คุณจะได้เรียนรู้วิธีพิมพ์ JSON ให้สวยงามด้วย Jackson ใน Java มาตรฐานและด้วย Spring Boot

เราจะทำงานกับสตริง JSON และ POJO ที่แปลงเป็นสตริง JSON เนื่องจากสิ่งเหล่านี้ทำงานแตกต่างกัน:

public class Book {
    private String title;
    private String author;
    private int releaseYear;

    public Book(String title, String author, int releaseYear) {
        this.title = title;
        this.author = author;
        this.releaseYear = releaseYear;
    }
    

มายกตัวอย่าง a Book อินสแตนซ์และสตริงสำหรับอินพุต:

String inputString = "{n" +
        ""Task 1" : "In_Progress",n" +
        ""Task 2" : "Done",n" +
        ""Task 3" : "Planned"n" +
        "}";

Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);

Pretty-Print JSON กับ Jackson Once

หากคุณต้องการพิมพ์สวยเพียงครั้งเดียว ในการโทรครั้งเดียว แทนที่จะตั้งค่าสถานะการพิมพ์ทั่วโลก คุณสามารถใช้ writerWithDefaultPrettyPrinter() โทรก่อนเขียนค่าเป็นสตริง:

ObjectMapper mapper = new ObjectMapper();

Object jsonString = mapper.readValue(inputString, Object.class);
String indentedString = mapper.writerWithDefaultPrettyPrinter()
                              .writeValueAsString(jsonString);
        
        
System.out.println(jsonString);
System.out.println(indentedString);

สตริงอินพุตถูกอ่านจาก (JSON-to-Object) และค่าของอ็อบเจ็กต์นี้ถูกเขียนกลับเป็นสตริงโดยใช้การพิมพ์แบบสวย (Object-to-JSON):

{Task 1=In_Progress, Task 2=Done, Task 3=Planned}

{
  "Task 1" : "In_Progress",
  "Task 2" : "Done",
  "Task 3" : "Planned"
}

หรือเมื่อใช้ readTree(), ผลลัพท์ที่ได้ JsonNode มี toPrettyString() ฟังก์ชันที่ทำหน้าที่เป็นวิธีง่ายๆ ในการแปลงสตริงเป็น JSON ที่พิมพ์สวย:

ObjectMapper mapper = new ObjectMapper();
Object jsonString = mapper.readTree(inputString).toPrettyString();
System.out.println(jsonString);

นี่เป็นวิธีที่รวดเร็วและง่ายดายในการจัดรูปแบบสตริง JSON อินพุต! เมื่อทำงานกับ POJO แทนที่จะอ่านจากอินพุตที่กำหนด เราจะทำการแปลง Object-to-JSON และเปิดใช้งานการพิมพ์ที่สวยงามเท่านั้น:

ObjectMapper mapper = new ObjectMapper();

String jsonBook = mapper.writeValueAsString(book);
String indentedBook = mapper.writerWithDefaultPrettyPrinter()
                            .writeValueAsString(book);


System.out.println(jsonBook);
System.out.println(indentedBook);
{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}
{
  "title" : "Our Mathematical Universe",
  "author" : "Max Tegmark",
  "releaseYear" : 2014
}

การตั้งค่า Global Pretty-Print

อีกวิธีหนึ่ง คุณสามารถเปิดใช้งานการพิมพ์แบบสวย ๆ ทั่วโลกได้ หากนั่นเป็นพฤติกรรมทั่วโลกที่ดีกว่าของ Jackson สำหรับโครงการของคุณ ง่ายเหมือนการใช้ enable() วิธีการของ ObjectMapper() ตัวอย่างเมื่อคุณสร้างอินสแตนซ์:

ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);

ทันทีที่คุณเขียนวัตถุเป็นสตริง JSON – การพิมพ์แบบสวยจะเปิดใช้งานตามค่าเริ่มต้น:

Object jsonString = mapper.readValue(inputString, Object.class);
String indentedString = mapper.writeValueAsString(jsonString);

System.out.println(jsonString);
System.out.println(indentedString);

ผลลัพธ์นี้ใน:

{Task 1=In_Progress, Task 2=Done, Task 3=Planned}
{
  "Task 1" : "In_Progress",
  "Task 2" : "Done",
  "Task 3" : "Planned"
}

ด้วย POJO:

String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!

{
  "title" : "Our Mathematical Universe",
  "author" : "Max Tegmark",
  "releaseYear" : 2014
}

วิธีการนี้ใช้ความละเอียดน้อยลงอย่างมากหากการพิมพ์ที่สวยงามเป็นรูปแบบการแสดงผลทั่วไป

แจ็กสันพิมพ์ลายสวยด้วย Spring Boot

หากคุณกำลังใช้ Spring Boot โดยไม่มีคู่มือ ObjectMapper อินสแตนซ์ที่กำลังสร้างและพึ่งพา Serializer พื้นฐาน คุณสามารถตั้งค่า indent_output ตั้งค่าสถานะเป็น true ใน application.properties ไฟล์:

spring.jackson.serialization.indent_output=true

หรือใน application.yaml:

spring:
  jackson:
    serialization:
      INDENT_OUTPUT: true

สิ่งนี้ทำให้ SerializationFeature.INDENT_OUTPUT ธงในฤดูใบไม้ผลิ ObjectMapper ตัวอย่าง.

สรุป

ในบทช่วยสอนสั้นๆ นี้ เราได้มาดูวิธีที่คุณสามารถพิมพ์ JSON จากสตริงหรือ POJO โดยใช้ Jackson ได้อย่างสวยงาม เราได้สำรวจการเปลี่ยนแปลงแบบพิมพ์ครั้งเดียว (เมื่อคุณต้องการพิมพ์เพียงครั้งเดียว) และตั้งค่าสถานะ Jackson ทั่วโลกสำหรับ ObjectMapper. สุดท้าย เรามาดูการเปลี่ยนแปลงคุณสมบัติของ Spring Boot เพื่อเปิดใช้งานการพิมพ์ที่สวยงามด้วย Jackson

ประทับเวลา:

เพิ่มเติมจาก สแต็ค