JSON เป็นคลาส Java
วางตัวอย่าง JSON แล้วตัวสร้างจะให้คลาส Java หนึ่งคลาสขึ้นไปพร้อมชนิดของฟิลด์ที่ถูกต้อง getter, setter และแอนโนเทชันของไลบรารี JSON รองรับ Jackson (@JsonProperty), Gson (@SerializedName) และ Lombok (@Data/@Builder) เพื่อโค้ดที่สะอาดขึ้น อ็อบเจกต์ที่ซ้อนกันจะกลายเป็นคลาสภายในหรือคลาสระดับเดียวกัน ขึ้นอยู่กับรูปแบบที่คุณเลือก
วิธีแปลง JSON เป็น Java
-
1
วาง JSON
ตัวอย่างเดียวก็เพียงพอ การใส่หลายตัวอย่างช่วยให้ตรวจจับได้แม่นยำขึ้นว่าฟิลด์ใดสามารถเป็น null ได้
-
2
เลือกไลบรารี
Jackson (พบมากที่สุดใน Spring), Gson (สำหรับ Android และบางโปรเจกต์รุ่นเก่า) หรือ POJO ธรรมดาที่ไม่มีแอนโนเทชัน
-
3
เลือกตัวเลือกเสริม
ใช้ Lombok หากต้องการ getter/setter อัตโนมัติ, builder pattern และ equals/hashCode หรือปล่อยไว้แบบเรียบง่ายก็ได้
-
4
เลือกรูปแบบการซ้อน
คลาสระดับเดียวกันในไฟล์เดียว (คลาส public ของ Java 17 ขึ้นไปต้องอยู่ในไฟล์แยก) หรือคลาส static ที่ซ้อนกัน
-
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": nullJackson จะโยนข้อผิดพลาด ให้ใช้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 และโปรแกรมแก้ไข
ตัวลดรูปพีชคณิตบูลีน
ประเมินนิพจน์บูลีนสำหรับทุกชุดอินพุตและดูตารางค่าความจริงที่สมบูรณ์ รองรับตัวแปรสูงสุดห้าตัวและตัวดำเนินการ &, |, !, ^
เครื่องมือนี้มีให้บริการในภาษาอื่น
- JSON을 Java 클래스로 [KO]
- JSON till Java-klass [SV]
- JSON إلى فئة Java [AR]
- JSON na klasę Java [PL]
- JSON zu Java-Klasse [DE]
- JSON vers classe Java [FR]
- JSON ke Kelas Java [ID]
- JSON naar Java-klasse [NL]
- JSON から Java クラスへ [JA]
- JSON sang lớp Java [VI]
- JSON para Classe Java [PT]
- JSON a Clase Java [ES]
- JSON to Java Class [EN]
- JSON in classe Java [IT]
- JSON 转 Java 类 [ZH]
- JSON в класс Java [RU]
- JSON'dan Java Sınıfına [TR]