JSON เป็นคลาส Java

วางตัวอย่าง JSON แล้วตัวสร้างจะให้คลาส Java หนึ่งคลาสขึ้นไปพร้อมชนิดของฟิลด์ที่ถูกต้อง getter, setter และแอนโนเทชันของไลบรารี JSON รองรับ Jackson (@JsonProperty), Gson (@SerializedName) และ Lombok (@Data/@Builder) เพื่อโค้ดที่สะอาดขึ้น อ็อบเจกต์ที่ซ้อนกันจะกลายเป็นคลาสภายในหรือคลาสระดับเดียวกัน ขึ้นอยู่กับรูปแบบที่คุณเลือก

วิธีแปลง JSON เป็น Java

  1. 1

    วาง JSON

    ตัวอย่างเดียวก็เพียงพอ การใส่หลายตัวอย่างช่วยให้ตรวจจับได้แม่นยำขึ้นว่าฟิลด์ใดสามารถเป็น null ได้

  2. 2

    เลือกไลบรารี

    Jackson (พบมากที่สุดใน Spring), Gson (สำหรับ Android และบางโปรเจกต์รุ่นเก่า) หรือ POJO ธรรมดาที่ไม่มีแอนโนเทชัน

  3. 3

    เลือกตัวเลือกเสริม

    ใช้ Lombok หากต้องการ getter/setter อัตโนมัติ, builder pattern และ equals/hashCode หรือปล่อยไว้แบบเรียบง่ายก็ได้

  4. 4

    เลือกรูปแบบการซ้อน

    คลาสระดับเดียวกันในไฟล์เดียว (คลาส public ของ Java 17 ขึ้นไปต้องอยู่ในไฟล์แยก) หรือคลาส static ที่ซ้อนกัน

  5. 5

    คัดลอกโค้ด

    นำไปวางในโปรเจกต์ของคุณได้ทันที ชื่อคลาสตรงกับคีย์ของ JSON และแพ็กเกจถูกตั้งค่าตามที่คุณกำหนด

ตัวอย่างผลลัพธ์: Jackson + Lombok

อินพุต:

{ "firstName": "Alice", "age": 30, "address": { "city": "Madrid" } }

เอาต์พุต:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @JsonProperty("firstName")
    private String firstName;

    @JsonProperty("age")
    private int age;

    @JsonProperty("address")
    private Address address;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Address {
    @JsonProperty("city")
    private String city;
}

การจับคู่ชนิดข้อมูล

JSON ชนิดของ Java
สตริง String
จำนวนเต็ม (≤ Integer.MAX) Integer / int
จำนวนเต็มขนาดใหญ่ Long / BigInteger
ทศนิยม Double / BigDecimal
บูลีน Boolean / boolean
วันที่แบบ ISO LocalDate (Jackson JSR-310)
วันที่และเวลาแบบ ISO Instant / OffsetDateTime
null (มีฟิลด์ระดับเดียวกันที่ไม่ใช่ null) ชนิดตัวหุ้ม (เช่น Integer)
อาร์เรย์ List<T>
อ็อบเจกต์ คลาสซ้อน

การเลือกระหว่างชนิดตัวหุ้มกับชนิดพื้นฐาน

  • ชนิดพื้นฐาน (int, long, boolean), เป็น null ไม่ได้ มีประสิทธิภาพ และไม่มีการทำ auto-boxing
  • ชนิดตัวหุ้ม (Integer, Long, Boolean), เป็น null ได้ จำเป็นเมื่อฟิลด์อาจขาดหายไปหรือมีค่า null ใน JSON

โดยค่าเริ่มต้น ตัวสร้างจะใช้ชนิดตัวหุ้มกับทุกสิ่งที่มองว่าเป็น null ได้ และใช้ชนิดพื้นฐานกับส่วนที่เหลือ

Jackson เทียบกับ Gson

คุณสมบัติ Jackson Gson
ความแพร่หลายใน Spring ใช่ (ค่าเริ่มต้น) ไม่ (ต้องตั้งค่า)
ประสิทธิภาพ เร็วกว่า ช้ากว่า
การรองรับวันที่ JSR-310 ผ่านโมดูลเสริม ผ่านโมดูลเสริม
ความหลากรูป (polymorphism) @JsonTypeInfo RuntimeTypeAdapter
การยอมรับเครื่องหมายจุลภาคท้าย ไม่ (ค่าเริ่มต้น) ใช่

ข้อผิดพลาดที่พบบ่อย

  • ใช้ชนิดพื้นฐานกับฟิลด์ที่เป็น null ได้ int เป็น null ไม่ได้ หาก JSON มี "age": null Jackson จะโยนข้อผิดพลาด ให้ใช้ Integer
  • ขาดโมดูลวันที่ Jackson ต้องใช้ jackson-datatype-jsr310 สำหรับ Instant/LocalDate หากไม่มี วันที่จะกลับไปเป็น String หรือค่า long แบบ epoch
  • ใช้ชนิดตัวหุ้มร่วมกันข้ามคลาสที่ไม่เกี่ยวข้องกัน หากโครงสร้าง JSON สองแบบต่างก็มี Address ซ้อนอยู่ ตัวสร้างจะสร้างคลาส Address สองคลาส ให้เปลี่ยนชื่อหรือรวมเข้าด้วยกันด้วยตนเอง
  • ลืมใส่ @JsonIgnoreProperties(ignoreUnknown = true) Jackson แบบเข้มงวดจะโยนข้อผิดพลาดเมื่อพบพร็อพเพอร์ตีที่ไม่รู้จัก ให้เพิ่มแอนโนเทชันนี้ (หรือตั้งค่าแบบทั่วทั้งระบบ) เพื่อการดีซีเรียลไลซ์ที่ยืดหยุ่น

คำถามที่พบบ่อย

ส่วนใหญ่เลือก Jackson เพราะเป็นค่าเริ่มต้นของ Spring เร็วกว่า และรองรับความหลากรูปได้ดีกว่า ส่วน Gson เบากว่าและเป็นที่รู้จักดีในฝั่ง Android แม้ว่าโปรเจกต์ Android จะหันไปใช้ Moshi หรือ kotlinx.serialization มากขึ้นเรื่อย ๆ

Lombok ช่วยลดโค้ดซ้ำซาก (getter, setter, equals, hashCode, builder) ลงได้มาก ใช้กันแพร่หลาย แต่ต้องมี annotation processor ของ Lombok ในกระบวนการบิลด์ ปิดใช้งานได้หากโปรเจกต์ของคุณเลี่ยง Lombok ด้วยเหตุผลด้านความสะอาดของ dependency

ฟิลด์ที่เป็น null ในตัวอย่างใด ๆ ที่พบจะกลายเป็นชนิดตัวหุ้ม (Integer แทน int) เพื่อให้เก็บค่า null ได้ จากนั้น Jackson จะดีซีเรียลไลซ์ "age": null ได้โดยไม่มีข้อผิดพลาด เพิ่ม @JsonInclude(Include.NON_NULL) เพื่อข้ามค่า null ขณะซีเรียลไลซ์

ได้ หากคุณเลือก “record” คลาส record นั้นกระชับ เปลี่ยนแปลงไม่ได้ และทำงานร่วมกับ Jackson 2.12+ ได้ สำหรับโปรเจกต์ Spring Boot 3 การใช้ record ควบคู่กับการสร้างที่ไม่พึ่ง Lombok ถือเป็นตัวเลือกสมัยใหม่

เครื่องมือที่เกี่ยวข้อง

ตารางอ้างอิง ASCII

ตาราง ASCII ครบตั้งแต่ 0 ถึง 127 พร้อมค่าเลขฐานสิบ ฐานสิบหก ฐานแปด ฐานสอง และรูปแบบการอ้างอิงอักขระแบบตัวเลขของ HTML รวม NUL, LF และ DEL

อ้างอิงตัวอักษร HTML

รายการที่สามารถค้นหาได้ขององค์ประกอบ HTML พร้อมรหัสชื่อและรหัสตัวเลข รวมถึงฟังก์ชันสำเนาด้วยคลิกเดียวสำหรับตัวอักษรพิเศษและสัญลักษณ์ต่างๆ

ตารางอ้างอิงแป้นพิมพ์ลัด

ค้นหาแป้นพิมพ์ลัดเริ่มต้นตามเอกสารของ VS Code, Chrome และ Bash ที่ใช้ GNU Readline บน macOS, Windows และ Linux

ตัวตรวจสอบอีเมล

ตรวจสอบที่อยู่อีเมล: ตรวจไวยากรณ์ RFC 5322 ค้นหา MX เรกคอร์ดแบบเรียลไทม์ พร้อมรายละเอียดส่วนท้องถิ่น โดเมน และความยาว ไม่มีการส่งอีเมลใด ๆ

เครื่องมือสร้าง EditorConfig

สร้างไฟล์ .editorconfig ด้วยกฎสไตล์และขนาดการเยื้อง การจบบรรทัด ชุดอักขระ และช่องว่างของคุณ เพื่อให้การจัดรูปแบบสอดคล้องกันในทุก IDE และโปรแกรมแก้ไข

ตัวลดรูปพีชคณิตบูลีน

ประเมินนิพจน์บูลีนสำหรับทุกชุดอินพุตและดูตารางค่าความจริงที่สมบูรณ์ รองรับตัวแปรสูงสุดห้าตัวและตัวดำเนินการ &, |, !, ^

เครื่องมือนี้มีให้บริการในภาษาอื่น