ToolDeck

JSON เป็น Java

สร้าง Java POJO classes จาก JSON

ลองตัวอย่าง
ชื่อ root class:

อินพุต JSON

เอาต์พุต Java

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ
Java classes จะแสดงที่นี่…

การแปลง JSON เป็น Java Class คืออะไร?

การแปลง JSON เป็น Java class คือกระบวนการนำ JSON object ดิบมาสร้างนิยาม Plain Old Java Object (POJO) ที่มี private fields, getters และ setters Java ไม่มีระบบประเภท JSON ในตัว ดังนั้น API response, ไฟล์กำหนดค่า หรือ message payload ทุกรายการจำเป็นต้องมี class ที่ตรงกันก่อน จึงจะทำงานกับข้อมูลได้อย่างปลอดภัยในเชิงประเภท ไลบรารีอย่าง Jackson และ Gson แมป JSON keys กับ Java fields ผ่าน reflection แต่ต้องมีนิยาม class ก่อนเสมอ

Java POJO มาตรฐานสำหรับการ deserialize JSON จะประกาศ private field สำหรับแต่ละ JSON key, constructor ที่ไม่มีพารามิเตอร์ และ getter/setter คู่สำหรับแต่ละ field JSON objects ที่ซ้อนกันจะกลายเป็น classes แยกกัน Arrays จะกลายเป็น fields ประเภท List'<'T'>' พร้อม import ของ java.util.List ประเภทพื้นฐาน JSON แมปกับประเภทพื้นฐานของ Java (int, double, boolean) หรือประเภท wrapper (Integer, Double, Boolean) เมื่อใช้ภายใน generics ค่า null มักแมปกับ Object หรือประเภท reference ที่เป็น nullable

การเขียนนิยาม class เหล่านี้ด้วยมือเป็นงานที่ซ้ำซาก คุณต้องอ่านแต่ละ JSON key กำหนดประเภท Java จากค่า แปลงรูปแบบการตั้งชื่อจาก camelCase JSON เป็น camelCase Java fields สร้างชื่อ class แบบ PascalCase สำหรับ objects ที่ซ้อนกัน และเพิ่ม boilerplate ของ getter/setter สำหรับ JSON object ที่มี 15 fields และ 3 nested objects นั่นหมายถึงการเขียน 4 classes, เมธอดมากกว่า 30 รายการ และต้องรักษาความสอดคล้องทั้งหมด เครื่องมือแปลงทำสิ่งนี้ในเวลาไม่กี่มิลลิวินาที

ทำไมต้องใช้เครื่องมือแปลง JSON เป็น Java?

การสร้าง Java POJOs จาก JSON ด้วยมือหมายถึงการตรวจสอบแต่ละ field อนุมานประเภทจากค่าตัวอย่าง เขียน getter/setter pairs และทำซ้ำสำหรับทุก nested object เมื่อสัญญา API เปลี่ยน คุณต้องอัปเดตทุกอย่างด้วยมือ เครื่องมือแปลงขจัดงานซ้ำซากนั้น

สร้าง POJO ทันที
วาย JSON แล้วรับนิยาม Java class ที่สมบูรณ์ในเวลาไม่ถึงวินาที Nested objects, lists และประเภทพื้นฐานถูกตรวจจับและแมปโดยอัตโนมัติ
🔒
ข้อมูลของคุณเป็นส่วนตัว
การแปลงทำงานทั้งหมดในเบราว์เซอร์ของคุณโดยใช้ JavaScript ข้อมูล JSON ไม่ออกจากเครื่อง API keys, tokens และข้อมูล production ยังคงเป็นส่วนตัว
📝
การอนุมานประเภทที่ถูกต้อง
ทุก field ที่สร้างขึ้นใช้ประเภท Java ที่เหมาะสมซึ่งอนุมานจากค่า JSON ได้แก่ String, int, double, boolean, List'<'T'>' หรือ Object สำหรับค่า null ประเภท wrapper ถูกใช้ภายใน generics
📦
ไม่ต้องสร้างบัญชีหรือติดตั้ง
เปิดหน้าและวาย JSON ไม่ต้องมี JDK ไม่มี Maven dependencies ไม่มีบัญชี ทำงานได้บนทุกอุปกรณ์ที่มีเบราว์เซอร์

กรณีใช้งาน JSON เป็น Java

การพัฒนา Spring Boot API
สร้าง request และ response DTOs จากตัวอย่าง JSON ของ API วาย payload shape ที่คาดหวังและรับ Java classes ที่พร้อมใช้กับ annotations @RequestBody และ @ResponseBody ใน Spring controllers
การพัฒนา Android App
สร้าง model classes สำหรับ Retrofit หรือ Volley network responses วาย JSON ที่ backend API ส่งกลับมาและรับ POJOs ที่ใช้งานได้กับ Gson หรือ Moshi converters
การเชื่อมต่อ Microservice
กำหนด typed message classes สำหรับ Kafka, RabbitMQ หรือ gRPC JSON payloads วาย message ตัวอย่างและสร้าง POJOs ที่บันทึกสัญญาที่คาดหวังระหว่างบริการ
การย้ายระบบเก่า
แปลง JSON API responses เป็น Java classes เมื่อครอบ REST endpoints ในรูปแบบ typed client มีประโยชน์เมื่อย้ายจากรูปแบบ Map'<'String, Object'>' ที่ไม่มีการกำหนดประเภทชัดเจนไปสู่ domain models ที่เหมาะสม
QA และการทดสอบอัตโนมัติ
สร้าง typed test fixtures จากตัวอย่าง API response วิศวกร QA สามารถวาย JSON responses จริงและสร้างนิยาม POJO สำหรับใช้ใน JUnit หรือ TestNG test suites ที่มี AssertJ assertions
การเรียนรู้รูปแบบ Java OOP
นักศึกษาสามารถวาย JSON structure ใดก็ได้และดูว่า Java แทนข้อมูลด้วย classes, fields, getters, setters และประเภทที่ซ้อนกันอย่างไร ผลลัพธ์ทำให้เห็นภาพชัดเจนแทนที่จะเป็นแค่ทฤษฎี

ตารางอ้างอิงการแมปประเภท JSON เป็น Java

ค่า JSON ทุกค่าแมปกับประเภท Java เฉพาะเจาะจง ตารางด้านล่างแสดงวิธีที่เครื่องมือแปลงแปลงประเภท JSON แต่ละอย่างเป็นประเภท Java ที่เทียบเท่า คอลัมน์ทางเลือกแสดงประเภท wrapper ที่ใช้ใน generic contexts อย่าง List'<'T'>' หรือ Java features ใหม่กว่าอย่าง Records

ประเภท JSONตัวอย่างประเภท Javaทางเลือก
string"hello"StringString
number (integer)42intint / Integer
number (float)3.14doubledouble / Double
booleantruebooleanboolean / Boolean
nullnullObjectObject (or @Nullable String)
object{"k": "v"}NestedClassRecord (Java 16+)
array of strings["a", "b"]List<String>List<String>
array of objects[{"id": 1}]List<Item>List<Item>
mixed array[1, "a"]List<Object>List<Object>

อ้างอิง Java JSON Annotation

เมื่อทำการ deserialize JSON ด้วย Jackson หรือ Gson annotations จะควบคุมวิธีที่ JSON keys แมปกับ Java fields วิธีจัดการ fields ที่ไม่รู้จัก และวิธีที่ค่า null ถูกจัดการ การอ้างอิงนี้ครอบคลุม annotations ที่คุณจะพบบ่อยที่สุดเมื่อทำงานกับ POJOs ที่สร้างขึ้น

Annotationวัตถุประสงค์ไลบรารี
@JsonProperty("name")Maps a JSON key to a Java field with a different nameJackson
@SerializedName("name")Same as @JsonProperty, but for the Gson libraryGson
@JsonIgnorePropertiesIgnores unknown JSON keys during deserialization instead of failingJackson
@NullableMarks a field as accepting null values from JSON inputJSR 305 / JetBrains
@NotNullEnforces that a field must not be null, throws on violationBean Validation
@JsonFormat(pattern=...)Defines a date/time format for serialization and deserializationJackson

POJO กับ Record กับ Lombok

Java มีสามแนวทางทั่วไปสำหรับการกำหนดโครงสร้างประเภทที่ใช้เก็บข้อมูล JSON แต่ละแนวทางเหมาะกับสไตล์โปรเจกต์และเวอร์ชัน Java ที่แตกต่างกัน POJOs คือรูปแบบดั้งเดิมที่มีความเข้ากันได้กว้างที่สุด Records ลด boilerplate สำหรับข้อมูลที่ไม่เปลี่ยนแปลง Lombok สร้าง getters, setters และ constructors ณ compile time ผ่าน annotations

POJO
รูปแบบ Java ดั้งเดิม ใช้งานได้กับ Java 8+ คุณกำหนด private fields พร้อมเมธอด getter/setter ควบคุมได้เต็มที่เรื่อง mutability และ custom logic เข้ากันได้กับทุก JSON library (Jackson, Gson, Moshi) เป็นตัวเลือกมาตรฐานสำหรับ Spring Boot, Android และ enterprise codebases
Record (Java 16+)
มีในตัวตั้งแต่ Java 16 (preview ใน Java 14) ไวยากรณ์กระชับ: record User(int id, String name) สร้าง constructor, accessors, equals, hashCode และ toString อัตโนมัติ instances ไม่เปลี่ยนแปลง Jackson รองรับ records ตั้งแต่เวอร์ชัน 2.12 เหมาะที่สุดสำหรับ value objects และ DTOs ที่ไม่ต้องการ setters
Lombok @Data
annotation processor ของ third-party ที่ทำงานใน compile time @Data สร้าง getters, setters, equals, hashCode และ toString @Builder เพิ่มรูปแบบ builder ลด boilerplate ให้ใกล้เคียงกับ Records ขณะยังคง mutability ไว้ ต้องเพิ่ม Lombok ใน build tool (Maven/Gradle) และ IDE plugin

ตัวอย่างโค้ด

ตัวอย่างเหล่านี้แสดงวิธีใช้ Java POJOs ที่สร้างขึ้นกับ Jackson สำหรับการ deserialize วิธีสร้าง Java classes ด้วยโปรแกรมจาก JavaScript และ Python และวิธีใช้ CLI tool ของ jsonschema2pojo สำหรับการสร้างแบบกลุ่ม

Java (Jackson deserialization)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private int id;
    private String name;
    private String email;
    private boolean active;
    private double score;
    private Address address;
    private List<String> tags;

    // getters and setters omitted for brevity

    public static void main(String[] args) throws Exception {
        String json = "{\"id\":1,\"name\":\"Alice\",\"email\":\"alice@example.com\",\"active\":true,\"score\":98.5,\"address\":{\"street\":\"123 Main St\",\"city\":\"Springfield\",\"zip\":\"12345\"},\"tags\":[\"admin\",\"user\"]}";
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        System.out.println(user.getName()); // -> Alice
    }
}

class Address {
    private String street;
    private String city;
    private String zip;
    // getters and setters
}
JavaScript (generate Java POJO from JSON)
// Minimal JSON-to-Java-POJO generator in JS
function jsonToJava(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "Object";
    if (typeof val === "string") return "String";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "double";
    if (typeof val === "boolean") return "boolean";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      if (!first) return "List<Object>";
      const elem = infer(first, fieldName);
      const boxed = elem === "int" ? "Integer" : elem === "double" ? "Double" : elem === "boolean" ? "Boolean" : elem;
      return `List<${boxed}>`;
    }
    if (typeof val === "object") {
      const cls = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, cls);
      return cls;
    }
    return "Object";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) => {
      const type = infer(v, k);
      return `    private ${type} ${k};`;
    });
    classes.push(`public class ${cls} {\n${fields.join("\n")}\n}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

console.log(jsonToJava({ id: 1, name: "Alice", scores: [98, 85] }, "User"));
// public class User {
//     private int id;
//     private String name;
//     private List<Integer> scores;
// }
Python (generate Java classes from JSON)
import json

def json_to_java(obj: dict, class_name: str = "Root") -> str:
    classes = []

    def infer(val, name):
        if val is None:
            return "Object"
        if isinstance(val, bool):
            return "boolean"
        if isinstance(val, int):
            return "int"
        if isinstance(val, float):
            return "double"
        if isinstance(val, str):
            return "String"
        if isinstance(val, list):
            if not val:
                return "List<Object>"
            elem = infer(val[0], name)
            boxed = {"int": "Integer", "double": "Double", "boolean": "Boolean"}.get(elem, elem)
            return f"List<{boxed}>"
        if isinstance(val, dict):
            cls = name[0].upper() + name[1:]
            build(val, cls)
            return cls
        return "Object"

    def build(obj, cls):
        fields = [f"    private {infer(v, k)} {k};" for k, v in obj.items()]
        classes.append(f"public class {cls} {{\n" + "\n".join(fields) + "\n}")

    build(obj, class_name)
    return "\n\n".join(classes)

data = json.loads('{"id": 1, "name": "Alice", "tags": ["admin"]}')
print(json_to_java(data, "User"))
# public class User {
#     private int id;
#     private String name;
#     private List<String> tags;
# }
CLI (jsonschema2pojo)
# Install jsonschema2pojo (requires Java 8+)
# Download from https://github.com/joelittlejohn/jsonschema2pojo

# Generate POJOs from a JSON file
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style jackson2

# Generate with Gson annotations instead
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style gson

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
  jsonschema2pojo --source-type json --annotation-style jackson2 \
  --target src/main/java --target-package com.example.model

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

POJO กับ Java Bean ต่างกันอย่างไร?
POJO (Plain Old Java Object) คือ Java class ธรรมดาที่ไม่มีการขึ้นอยู่กับ framework ใดๆ Java Bean คือ POJO ที่ปฏิบัติตามข้อกำหนดเฉพาะ ได้แก่ constructor ที่ไม่มีพารามิเตอร์, private fields ที่มี public getters และ setters และ implements Serializable สำหรับการแมป JSON ไลบรารีส่วนใหญ่ต้องการรูปแบบ Bean (getters/setters) แต่ไม่ต้องการ Serializable classes ที่สร้างโดยเครื่องมือนี้ปฏิบัติตามรูปแบบ getter/setter ของ Bean
ควรใช้ JSON library ใดกับ POJOs ที่สร้างขึ้น?
Jackson (com.fasterxml.jackson) เป็น Java JSON library ที่ใช้กันแพร่หลายที่สุดและเป็นค่าเริ่มต้นใน Spring Boot Gson (com.google.gson) เป็นที่นิยมในโปรเจกต์ Android และมี API ที่ง่ายกว่า Moshi เป็นทางเลือกใหม่กว่าจาก Square ออกแบบมาสำหรับการทำงานร่วมกับ Kotlin ทั้งสามตัวทำงานได้กับ POJOs มาตรฐานที่มี getters และ setters
เครื่องมือแปลงจัดการ nested JSON objects อย่างไร?
แต่ละ nested object จะกลายเป็น Java class แยกกัน หาก JSON field ชื่อ "address" มี object ที่มี keys "street" และ "city" เครื่องมือแปลงจะสร้าง class ชื่อ Address ที่มี fields เหล่านั้นและกำหนดประเภทของ field หลักเป็น Address โครงสร้างที่ซ้อนกันลึกจะสร้างนิยาม class หลายชุด
เกิดอะไรขึ้นเมื่อ JSON field เป็น null?
Fields ที่เป็น null จะถูกกำหนดประเภทเป็น Object เนื่องจากเครื่องมือแปลงไม่สามารถอนุมานประเภทที่ต้องการจากค่า null เพียงอย่างเดียว ในทางปฏิบัติ คุณควรแทนที่ Object ด้วยประเภทที่คาดหวัง (String, Integer ฯลฯ) เมื่อทราบสัญญา API หากใช้ Jackson ค่า null จะถูกกำหนดให้กับ reference-type fields โดยค่าเริ่มต้นโดยไม่เกิดข้อผิดพลาด
ควรใช้ Java Records แทน POJOs สำหรับ JSON ไหม?
Records เหมาะสำหรับ data transfer objects ที่ไม่เปลี่ยนแปลงซึ่งไม่ต้องการ setters Jackson รองรับ records ตั้งแต่เวอร์ชัน 2.12 และ Gson เพิ่มการรองรับในเวอร์ชันหลังๆ หากโปรเจกต์ของคุณทำงานบน Java 16+ และคุณใช้ API responses เป็นข้อมูลอ่านอย่างเดียว records จะลด boilerplate ได้ หากต้องการ mutability หรือกำหนดเป้าหมายเป็น Java 8/11 ให้ใช้ POJOs
จัดการ JSON keys ที่ไม่ใช่ Java identifiers ที่ถูกต้องอย่างไร?
JSON keys อย่าง "first-name" หรือ "2nd_place" ไม่ใช่ชื่อ Java field ที่ถูกต้อง ใช้ @JsonProperty("first-name") ใน Jackson หรือ @SerializedName("first-name") ใน Gson เพื่อแมป JSON key กับชื่อ Java field ที่ถูกต้องอย่าง firstName เครื่องมือแปลงจะแปลงชื่อ key เป็น camelCase Java fields โดยอัตโนมัติ
สร้าง Java classes จาก JSON Schema แทน JSON sample ได้ไหม?
เครื่องมือนี้สร้าง classes จากตัวอย่างข้อมูล JSON สำหรับอินพุต JSON Schema ให้ใช้โปรเจกต์ jsonschema2pojo (มีให้ใช้เป็น CLI tool, Maven plugin และ Gradle plugin) เครื่องมือนี้อ่านไฟล์ JSON Schema และสร้าง Java classes ที่มี annotations พร้อม validation constraints, ค่าเริ่มต้น และเอกสารจากคำอธิบายใน schema