JSON sang Java

Tạo lớp Java POJO từ JSON

Thử ví dụ
Tên lớp gốc:

Đầu vào JSON

Đầu ra Java

Chạy cục bộ · An toàn để dán thông tin bí mật
Các lớp Java sẽ hiển thị ở đây…

Chuyển đổi JSON sang lớp Java là gì?

Chuyển đổi JSON sang lớp Java lấy một đối tượng JSON thô và tạo ra các định nghĩa Plain Old Java Object (POJO) với các trường private, getters và setters. Java không có hệ thống kiểu JSON tích hợp sẵn, vì vậy mọi phản hồi API JSON, file cấu hình hoặc payload tin nhắn đều cần một lớp tương ứng trước khi bạn có thể làm việc với nó theo cách an toàn kiểu. Các thư viện như Jackson và Gson ánh xạ các khóa JSON sang trường Java thông qua reflection, nhưng chúng yêu cầu các định nghĩa lớp phải tồn tại trước.

Một POJO Java chuẩn để giải tuần tự hóa JSON khai báo một trường private cho mỗi khóa JSON, một constructor không tham số, và một cặp getter/setter cho mỗi trường. Các đối tượng JSON lồng nhau trở thành các lớp riêng biệt. Mảng trở thành các trường List'<'T'>' với lệnh import java.util.List. Các kiểu JSON nguyên thủy ánh xạ sang kiểu nguyên thủy Java (int, double, boolean) hoặc kiểu wrapper của chúng (Integer, Double, Boolean) khi dùng bên trong generics. Giá trị null thường ánh xạ sang Object hoặc kiểu tham chiếu nullable.

Viết các định nghĩa lớp này bằng tay rất lặp đi lặp lại. Bạn phải đọc từng khóa JSON, xác định kiểu Java từ giá trị, chuyển đổi quy ước đặt tên từ camelCase JSON sang trường Java camelCase, tạo tên lớp PascalCase cho các đối tượng lồng nhau và thêm phần getter/setter. Với một đối tượng JSON có 15 trường và 3 đối tượng lồng nhau, điều đó có nghĩa là viết 4 lớp, hơn 30 phương thức và giữ cho mọi thứ nhất quán. Một bộ chuyển đổi thực hiện việc này trong vài mili giây.

Tại sao dùng bộ chuyển đổi JSON sang Java?

Tạo thủ công các Java POJO từ JSON đòi hỏi kiểm tra từng trường, suy luận kiểu từ giá trị mẫu, viết các cặp getter/setter và lặp lại quá trình này cho mọi đối tượng lồng nhau. Khi hợp đồng API thay đổi, bạn phải cập nhật mọi thứ bằng tay. Một bộ chuyển đổi loại bỏ công việc lặp đi lặp lại đó.

Tạo POJO ngay lập tức
Dán JSON của bạn và nhận các định nghĩa lớp Java hoàn chỉnh trong chưa đến một giây. Các đối tượng lồng nhau, danh sách và kiểu nguyên thủy được phát hiện và ánh xạ tự động.
🔒
Xử lý ưu tiên bảo mật
Quá trình chuyển đổi chạy hoàn toàn trong trình duyệt của bạn bằng JavaScript. Dữ liệu JSON của bạn không bao giờ rời khỏi máy. API key, token và dữ liệu thực tế vẫn được bảo mật.
📝
Suy luận kiểu chính xác
Mọi trường được tạo đều sử dụng kiểu Java phù hợp được suy ra từ giá trị JSON: String, int, double, boolean, List'<'T'>' hoặc Object cho giá trị null. Kiểu wrapper được dùng bên trong generics.
📦
Không cần cài đặt hay đăng ký
Mở trang và dán JSON của bạn. Không cần JDK, không cần phụ thuộc Maven, không cần tài khoản. Hoạt động trên bất kỳ thiết bị nào có trình duyệt.

Các trường hợp sử dụng JSON sang Java

Phát triển API Spring Boot
Tạo các DTO request và response từ mẫu JSON của API. Dán hình dạng payload dự kiến và nhận các lớp Java sẵn sàng cho các annotation @RequestBody và @ResponseBody trong Spring controllers.
Phát triển ứng dụng Android
Tạo các lớp model cho phản hồi mạng Retrofit hoặc Volley. Dán JSON được trả về bởi backend API của bạn và nhận các POJO tương thích với bộ chuyển đổi Gson hoặc Moshi.
Tích hợp Microservice
Định nghĩa các lớp tin nhắn có kiểu cho payload JSON của Kafka, RabbitMQ hoặc gRPC. Dán một tin nhắn mẫu và tạo các POJO ghi lại hợp đồng dự kiến giữa các dịch vụ.
Di chuyển hệ thống cũ
Chuyển đổi phản hồi JSON API thành các lớp Java khi bọc các REST endpoint trong một typed client. Hữu ích khi di chuyển từ các pattern Map'<'String, Object'>' thiếu kiểu sang các domain model phù hợp.
QA và Tự động hóa kiểm thử
Xây dựng các test fixture có kiểu từ mẫu phản hồi API. Kỹ sư QA có thể dán phản hồi JSON thực tế và tạo các định nghĩa POJO để dùng trong test suite JUnit hoặc TestNG với các assertion AssertJ.
Học các pattern OOP trong Java
Sinh viên có thể dán bất kỳ cấu trúc JSON nào và xem Java biểu diễn nó như thế nào với các lớp, trường, getters, setters và kiểu lồng nhau. Kết quả đầu ra giúp hình dung cụ thể thay vì trừu tượng.

Bảng ánh xạ kiểu JSON sang Java

Mỗi giá trị JSON ánh xạ sang một kiểu Java cụ thể. Bảng dưới đây cho thấy bộ chuyển đổi dịch từng kiểu JSON sang tương đương Java như thế nào. Cột Thay thế hiển thị các kiểu wrapper dùng trong ngữ cảnh generic như List'<'T'>', hoặc các tính năng Java mới hơn như Records.

Kiểu JSONVí dụKiểu JavaThay thế
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>

Tham chiếu Annotation JSON trong Java

Khi giải tuần tự hóa JSON với Jackson hoặc Gson, các annotation kiểm soát cách ánh xạ khóa JSON sang trường Java, cách xử lý các trường không xác định và cách xử lý giá trị null. Tài liệu tham chiếu này bao gồm các annotation bạn sẽ gặp thường xuyên nhất khi làm việc với các POJO được tạo.

AnnotationMục đíchThư viện
@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 vs Record vs Lombok

Java có ba cách tiếp cận phổ biến để định nghĩa các cấu trúc có kiểu chứa dữ liệu JSON. Mỗi cách phù hợp với một phong cách dự án và phiên bản Java khác nhau. POJO là pattern truyền thống với khả năng tương thích rộng nhất. Record giảm boilerplate cho dữ liệu bất biến. Lombok tạo getters, setters và constructors tại thời điểm biên dịch thông qua annotation.

POJO
Pattern Java truyền thống. Hoạt động với Java 8+. Bạn định nghĩa các trường private cùng các phương thức getter/setter. Kiểm soát hoàn toàn tính khả biến và logic tùy chỉnh. Tương thích với mọi thư viện JSON (Jackson, Gson, Moshi). Lựa chọn tiêu chuẩn cho Spring Boot, Android và codebase doanh nghiệp.
Record (Java 16+)
Tích hợp sẵn từ Java 16 (preview ở bản 14). Cú pháp gọn: record User(int id, String name) tạo constructor, accessors, equals, hashCode và toString. Các instance là bất biến. Jackson hỗ trợ record từ phiên bản 2.12. Phù hợp nhất cho value object và DTO khi bạn không cần setters.
Lombok @Data
Bộ xử lý annotation bên thứ ba tại thời điểm biên dịch. @Data tạo getters, setters, equals, hashCode và toString. @Builder thêm builder pattern. Giảm boilerplate gần ngang mức record trong khi vẫn giữ tính khả biến. Yêu cầu thêm Lombok vào build tool (Maven/Gradle) và plugin IDE.

Ví dụ mã nguồn

Các ví dụ này cho thấy cách sử dụng Java POJO được tạo với Jackson để giải tuần tự hóa, cách tạo các lớp Java theo chương trình từ JavaScript và Python, và cách dùng công cụ CLI jsonschema2pojo để tạo hàng loạt.

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

Câu hỏi thường gặp

Sự khác nhau giữa POJO và Java Bean là gì?
Một POJO (Plain Old Java Object) là bất kỳ lớp Java đơn giản nào không có phụ thuộc framework. Một Java Bean là POJO tuân theo các quy ước cụ thể: constructor không tham số, trường private với getters và setters public, và implements Serializable. Để ánh xạ JSON, hầu hết các thư viện yêu cầu quy ước Bean (getters/setters) nhưng không yêu cầu Serializable. Các lớp được tạo bởi công cụ này tuân theo pattern getter/setter của Bean.
Tôi nên dùng thư viện JSON nào với các POJO được tạo?
Jackson (com.fasterxml.jackson) là thư viện JSON Java được sử dụng rộng rãi nhất và là mặc định trong Spring Boot. Gson (com.google.gson) phổ biến trong các dự án Android và có API đơn giản hơn. Moshi là lựa chọn thay thế mới hơn từ Square, được thiết kế cho khả năng tương tác với Kotlin. Cả ba đều hoạt động với POJO chuẩn có getters và setters.
Bộ chuyển đổi xử lý các đối tượng JSON lồng nhau như thế nào?
Mỗi đối tượng lồng nhau trở thành một lớp Java riêng biệt. Nếu một trường JSON có tên "address" chứa đối tượng với các khóa "street" và "city", bộ chuyển đổi tạo ra lớp Address với các trường đó và đặt kiểu của trường cha là Address. Các cấu trúc lồng nhau sâu sẽ tạo ra nhiều định nghĩa lớp.
Điều gì xảy ra khi một trường JSON là null?
Các trường null được đặt kiểu là Object vì bộ chuyển đổi không thể suy ra kiểu dự kiến từ giá trị null đơn thuần. Trong thực tế, bạn sẽ thay Object bằng kiểu dự kiến (String, Integer, v.v.) khi bạn biết hợp đồng API. Nếu dùng Jackson, giá trị null được gán cho các trường kiểu tham chiếu theo mặc định mà không có lỗi.
Tôi có nên dùng Java Records thay vì POJO cho JSON không?
Record hoạt động tốt cho các đối tượng truyền dữ liệu bất biến khi bạn không cần setters. Jackson hỗ trợ record từ phiên bản 2.12, và Gson đã thêm hỗ trợ trong các bản phát hành sau. Nếu dự án của bạn chạy trên Java 16+ và bạn xử lý phản hồi API như dữ liệu chỉ đọc, record giảm boilerplate. Nếu bạn cần tính khả biến hoặc nhắm đến Java 8/11, hãy dùng POJO.
Làm thế nào để xử lý các khóa JSON không phải định danh Java hợp lệ?
Các khóa JSON như "first-name" hoặc "2nd_place" không phải tên trường Java hợp lệ. Dùng @JsonProperty("first-name") trong Jackson hoặc @SerializedName("first-name") trong Gson để ánh xạ khóa JSON sang tên trường Java hợp lệ như firstName. Bộ chuyển đổi tự động chuyển đổi tên khóa sang trường Java camelCase.
Tôi có thể tạo lớp Java từ JSON Schema thay vì mẫu JSON không?
Công cụ này tạo các lớp từ mẫu dữ liệu JSON. Để nhập JSON Schema, hãy dùng dự án jsonschema2pojo (có sẵn dưới dạng công cụ CLI, plugin Maven và plugin Gradle). Nó đọc file JSON Schema và tạo các lớp Java có annotation với các ràng buộc validation, giá trị mặc định và tài liệu từ mô tả schema.