Tấn Phát Digital

JSON to Java POJO

Dán JSON để nhận lớp Java có getter/setter, lớp Lombok @Data hoặc record Java 16+, kèm @JsonProperty của Jackson hoặc @SerializedName của Gson khi tên đổi.

Tùy chọn mã Java

Kiểu lớp

Thư viện JSON

JSON đầu vào
Mã Java sinh ra
Đọc kết quả thế nào

Toàn bộ kết quả là một file: lớp gốc ở ngoài, các lớp con nằm bên trong dưới dạng lớp lồng static (hoặc record lồng). Lưu thành Root.java trong đúng thư mục của package là biên dịch được, không phải tách mỗi lớp một file.

Trường có thể vắng hoặc null dùng kiểu boxed (Integer, Long, Double, Boolean) để giữ được giá trị null; trường luôn có giá trị dùng kiểu nguyên thủy. Trường chỉ có null trong mẫu ra Object kèm chú thích, hãy sửa lại theo tài liệu API.

Chuỗi ngày giờ được giữ là String. Nếu muốn dùng OffsetDateTime hay LocalDate, hãy đổi kiểu bằng tay và đăng ký module jackson-datatype-jsr310 cho ObjectMapper.

Hợp tác ngay với Tấn Phát Digital

Chúng tôi không chỉ thiết kế website, mà còn giúp doanh nghiệp xây dựng thương hiệu số mạnh mẽ. Cung cấp dịch vụ thiết kế website trọn gói từ thiết kế đến tối ưu SEO. Hãy liên hệ ngay với Tấn Phát Digital để cùng tạo nên những giải pháp công nghệ đột phá, hiệu quả và bền vững cho doanh nghiệp của bạn tại Hồ Chí Minh.

Sinh POJO, lớp Lombok hoặc record Java từ một mẫu JSON

Công cụ JSON to Java nhận một mẫu JSON và sinh lớp Java tương ứng theo ba kiểu: POJO truyền thống có getter, setter; lớp gọn với @Data của Lombok; hoặc record của Java 16 trở lên. Tên khóa được đổi sang camelCase, khi tên đổi thì có @JsonProperty của Jackson hoặc @SerializedName của Gson để vẫn khớp khóa gốc. Trường có thể vắng hay null dùng kiểu boxed, mảng ra List<>, kết quả nằm gọn trong một file .java có package.

Tính năng nổi bật

  • Ba kiểu đầu ra: POJO với trường private kèm getter và setter, lớp Lombok có @Data @NoArgsConstructor @AllArgsConstructor, hoặc record Java 16+
  • Gắn @JsonProperty (Jackson), @SerializedName (Gson) hoặc không gắn; mặc định chỉ gắn khi tên trường khác khóa gốc, có tùy chọn gắn cho mọi trường
  • Tùy chọn @JsonIgnoreProperties(ignoreUnknown = true) để Jackson không ném lỗi khi API thêm khóa mới
  • Đổi khóa snake_case, kebab-case, có dấu tiếng Việt, có khoảng trắng thành camelCase hợp lệ; khóa trùng từ khóa Java như class, default, new được thêm dấu gạch dưới kèm annotation
  • Kiểu nguyên thủy int, long, double, boolean cho trường luôn có giá trị; Integer, Long, Double, Boolean cho trường có thể vắng hoặc null; tùy chọn luôn dùng kiểu boxed
  • Gộp mọi phần tử của mảng object để suy kiểu, trường không có ở mọi phần tử được ghi chú thích; số nguyên vượt int lên long, vượt long ra BigInteger; tùy chọn BigDecimal cho số thực
  • Trường boolean tên isXxx dùng Boolean với getIsXxx() để Jackson và Lombok không hiểu nhầm tên thuộc tính thành xxx
  • Trường có tên kiểu eTag (một chữ thường rồi chữ hoa) được gắn @JsonProperty cả ở trường, getter và setter trong kiểu POJO để Jackson không tách thành hai thuộc tính
  • Mảng ra List<>, object rỗng ra Map<String, Object>, trường chỉ có null hoặc mảng lẫn kiểu ra Object kèm chú thích
  • Lớp con nằm trong lớp gốc dưới dạng lớp lồng static hoặc record lồng, đặt tên theo khóa và đổi sang số ít, nên cả kết quả là một file .java biên dịch được
  • Dòng chú thích gợi ý câu lệnh đọc JSON bằng ObjectMapper hoặc Gson đúng kiểu gốc, kể cả khi JSON gốc là mảng; mở file .json, sao chép mã, tải file .java

Model Java cho JSON nên được sinh từ dữ liệu thật

Viết lớp Java cho một phản hồi API tốn thời gian nhất ở phần lặp đi lặp lại: khai báo trường, sinh getter, setter, thêm annotation cho từng khóa có gạch dưới. Gõ sai một chữ trong annotation thì trường đó luôn null mà Jackson không báo gì; quên @JsonIgnoreProperties thì lần đầu API thêm một khóa mới, ứng dụng ném UnrecognizedPropertyException. Còn chọn int hay Integer cho trường có lúc vắng mặt là chỗ hay gây NullPointerException khi tự mở hộp giá trị. Công cụ này đọc toàn bộ mẫu để biết trường nào luôn có, trường nào lúc có lúc không, rồi chọn kiểu nguyên thủy hay boxed tương ứng, sinh đủ annotation và đặt các lớp con vào một file duy nhất. Bạn chỉ phải rà lại những chỗ được ghi chú thích, như trường chỉ có null trong mẫu.

Lợi ích khi sử dụng

  • Tiết kiệm phần gõ getter, setter và annotation lặp lại cho những phản hồi API có hàng chục khóa
  • Chọn đúng kiểu boxed cho trường có thể vắng, tránh NullPointerException khi mở hộp giá trị
  • Kết quả gọn trong một file nhờ lớp lồng static, không phải tách và đặt tên nhiều file
  • Dùng được cho cả dự án Spring Boot (Jackson) lẫn ứng dụng Android dùng Gson
  • Chạy trên trình duyệt, không gửi JSON có dữ liệu khách hàng lên máy chủ nào
  • Cách suy kiểu thống nhất với các công cụ JSON sang C#, PHP, Kotlin trên cùng trang

Cách chuyển JSON sang lớp Java

  1. 1Trong khối Tùy chọn mã Java, nhập Tên lớp gốc và Package; để trống package nếu lớp nằm ở gói mặc định.
  2. 2Chọn Kiểu lớp: POJO getter/setter, Lombok @Data hoặc record (Java 16+); chọn Thư viện JSON: Jackson, Gson hoặc Không gắn.
  3. 3Bật hoặc tắt các ô Luôn gắn tên JSON, Bỏ qua khóa lạ, Luôn dùng kiểu boxed, Số nguyên luôn dùng long, Số thực dùng BigDecimal theo quy ước của dự án.
  4. 4Dán JSON vào ô JSON đầu vào, hoặc bấm Mở file .json, hoặc bấm Nạp ví dụ để xem thử; JSON sai cú pháp sẽ báo lỗi kèm số dòng.
  5. 5Đọc mã ở ô Mã Java sinh ra, chú ý các dòng chú thích // đánh dấu trường cần sửa kiểu bằng tay.
  6. 6Bấm Sao chép mã hoặc Tải file .java, rồi đặt file vào thư mục tương ứng với package trong dự án.

POJO, Lombok hay record: chọn kiểu nào

POJO với getter, setter tường minh không cần thư viện ngoài và chạy trên mọi phiên bản Java, nhưng dài: mỗi trường tốn ba khối mã. Lombok rút gọn bằng @Data, tự sinh getter, setter, equals, hashCode, toString lúc biên dịch; công cụ thêm @NoArgsConstructor vì Jackson cần hàm khởi tạo không tham số để tạo đối tượng rồi gọi setter, và @AllArgsConstructor để bạn tạo đối tượng nhanh trong test. Lombok đòi hỏi cài thư viện và plugin cho IDE. Record, chính thức từ Java 16, là kiểu dữ liệu bất biến: mọi trường khai báo một lần trong phần đầu, không có setter, có sẵn equals và hashCode theo giá trị. Jackson đọc được record từ bản 2.12, Gson từ bản 2.10. Record hợp với DTO chỉ đọc như phản hồi API; nếu bạn cần sửa đối tượng sau khi đọc, hãy dùng POJO hoặc Lombok.

Khi nào cần @JsonProperty và @SerializedName

Jackson tìm thuộc tính theo tên suy ra từ getter, setter hoặc tên trường. Trường userId khớp khóa userId mà không cần gì thêm, nhưng không khớp user_id. Vì thế mặc định công cụ chỉ gắn @JsonProperty("user_id") khi tên trường khác khóa gốc, mã gọn hơn mà vẫn đúng. Nếu ObjectMapper của dự án đã cấu hình PropertyNamingStrategies.SNAKE_CASE, bạn có thể chọn Không gắn. Gson làm việc trực tiếp với trường, không qua getter, và annotation tương ứng là @SerializedName. Một số nhóm muốn mọi trường đều có annotation để đổi tên trường trong Java mà không ảnh hưởng JSON; khi đó bật Luôn gắn tên JSON. Với Jackson, ô Bỏ qua khóa lạ thêm @JsonIgnoreProperties(ignoreUnknown = true) lên từng lớp, vì Jackson mặc định ném UnrecognizedPropertyException khi gặp khóa không có trong lớp. Gson mặc định đã bỏ qua khóa lạ.

Kiểu nguyên thủy hay kiểu boxed

Kiểu nguyên thủy int, long, double, boolean không giữ được null: khi khóa vắng mặt, Jackson để giá trị mặc định 0 hoặc false, bạn không phân biệt được khóa vắng với khóa mang giá trị 0. Kiểu boxed Integer, Long, Double, Boolean giữ được null nhưng mở hộp một giá trị null sẽ ném NullPointerException. Công cụ chọn theo dữ liệu: trường luôn có mặt và không bao giờ null trong mẫu dùng kiểu nguyên thủy, trường vắng ở một số phần tử hoặc có lúc null dùng kiểu boxed và có chú thích. Phần tử trong List luôn là kiểu boxed vì Java không cho List<int>. Nếu dự án quy định dùng boxed cho mọi DTO, bật Luôn dùng kiểu boxed. Riêng trường boolean có tên bắt đầu bằng is như isActive luôn dùng Boolean, vì với boolean nguyên thủy, getter isActive() khiến Jackson và Lombok hiểu tên thuộc tính là active, lệch với khóa isActive.

Suy kiểu số và mảng

Công cụ đọc lại chữ số gốc trong JSON thay vì dựa vào JSON.parse, nên giá trị 1.0 vẫn được coi là số thực. Số nguyên trong phạm vi int (đến 2.147.483.647) ra int, lớn hơn ra long, vượt cả long ra BigInteger. Một trường có lúc là số nguyên, lúc có phần lẻ ra double, hoặc BigDecimal nếu bạn bật tùy chọn, nên bật với số tiền để tránh sai số nhị phân. Mảng được dồn tất cả phần tử để suy kiểu phần tử: mảng object ra List của một lớp con gộp đủ các khóa, mảng rỗng ra List<Object>, mảng lẫn số và chuỗi ra List<Object> kèm chú thích. Mảng lồng mảng ra List<List<...>>. Object rỗng {} không có gì để suy nên ra Map<String, Object>, phù hợp với những trường kiểu metadata có khóa động.

Vì sao các lớp con nằm bên trong lớp gốc

Java chỉ cho một lớp public ở cấp cao nhất trong mỗi file, và tên file phải trùng tên lớp đó. Nếu sinh mỗi lớp con thành một lớp public riêng, bạn sẽ phải tách kết quả ra nhiều file. Công cụ đặt lớp gốc ở ngoài và mọi lớp con bên trong dưới dạng public static class (hoặc record lồng, vốn đã ngầm là static), nên chỉ cần lưu một file mang tên lớp gốc. Từ code khác, bạn gọi lớp con bằng Root.Order hoặc import riêng. Java cấm lớp lồng trùng tên lớp bao ngoài, nên khi JSON có khóa trùng tên lớp gốc, lớp con được ghép thêm tên cha, ví dụ RootRoot. Khi JSON gốc là mảng lồng mảng và không có lớp gốc rõ ràng, các lớp được gói trong lớp Models.

Ngày giờ, enum và những gì công cụ không làm

Chuỗi ngày giờ như 2024-05-27T07:32:00Z được giữ là String. Lý do là Jackson cần module jackson-datatype-jsr310 để đọc OffsetDateTime, LocalDate, Instant, còn Gson cần TypeAdapter riêng; sinh sẵn kiểu java.time mà dự án chưa đăng ký module sẽ gây lỗi lúc chạy. Bạn tự đổi kiểu khi đã cấu hình. Công cụ cũng không sinh enum từ các giá trị chuỗi lặp lại, không gộp hai lớp con có cùng cấu trúc, không sinh builder, không thêm annotation kiểm tra hợp lệ như @NotNull. Khóa trùng lặp trong một object được xử lý như trình phân tích JSON thông thường: giá trị sau thắng. Mã được kiểm thử về cú pháp bằng các ca mẫu nhưng chưa biên dịch trên trang; hãy build lại trong dự án sau khi dán.

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

Cách chuyển JSON sang Java object nhanh nhất?

Dán JSON vào ô JSON đầu vào, lớp Java hiện ngay bên cạnh, rồi bấm Sao chép mã. Lớp này dùng với new ObjectMapper().readValue(json, Root.class) của Jackson hoặc new Gson().fromJson(json, Root.class). Dòng chú thích đầu kết quả ghi sẵn câu lệnh đúng kiểu gốc.

POJO là gì và khác JavaBean thế nào?

POJO (Plain Old Java Object) là lớp Java thường, không kế thừa hay cài đặt gì của framework. JavaBean là POJO theo quy ước: trường private, getter và setter công khai, có hàm khởi tạo không tham số. Kiểu POJO getter/setter của công cụ sinh đúng quy ước JavaBean nên Jackson, Spring và các thư viện đọc bean đều dùng được.

JSON to Java record cần phiên bản Java nào?

Record chính thức từ Java 16; Java 14 và 15 chỉ có ở dạng preview. Để đọc JSON vào record, cần Jackson 2.12 trở lên hoặc Gson 2.10 trở lên. Spring Boot 3 chạy trên Java 17 nên dùng record được ngay.

Lombok @Data có cần thêm gì để Jackson đọc được?

Jackson cần hàm khởi tạo không tham số và setter, @Data đã sinh setter, còn công cụ thêm @NoArgsConstructor. @AllArgsConstructor được thêm để tạo đối tượng nhanh trong test. Bạn cần khai báo Lombok trong Maven hoặc Gradle và bật annotation processing trong IDE.

Vì sao có trường dùng Integer thay vì int?

Trường đó vắng mặt ở ít nhất một phần tử của mảng hoặc có giá trị null trong mẫu. Integer giữ được null, còn int sẽ thành 0 và bạn không biết khóa có thật hay không. Bật Luôn dùng kiểu boxed nếu muốn mọi trường đều là boxed.

Gặp lỗi UnrecognizedPropertyException khi đọc JSON thì sửa sao?

Lỗi này do JSON có khóa không có trong lớp và Jackson mặc định không bỏ qua. Bật ô Bỏ qua khóa lạ để công cụ thêm @JsonIgnoreProperties(ignoreUnknown = true) lên mọi lớp, hoặc cấu hình FAIL_ON_UNKNOWN_PROPERTIES bằng false trên ObjectMapper. Nếu khóa đó cần dùng, hãy sinh lại lớp từ mẫu mới có khóa ấy.

Trường isActive bị Jackson đọc thành active, xử lý thế nào?

Với boolean nguyên thủy, getter tên isActive() làm Jackson hiểu tên thuộc tính là active. Công cụ tránh lỗi này bằng cách dùng Boolean và getter getIsActive(), khớp đúng khóa isActive. Nếu bạn tự sửa lại thành boolean, hãy gắn @JsonProperty("isActive") lên trường.

Khóa JSON có gạch dưới như user_id được đặt tên trường thế nào?

Khóa được đổi sang camelCase thành userId và gắn @JsonProperty("user_id") hoặc @SerializedName("user_id"). Khóa có dấu tiếng Việt được bỏ dấu, khóa bắt đầu bằng chữ số được thêm tiền tố f. Khóa trùng từ khóa Java như class thành class_ kèm annotation.

Có sinh được lớp cho Gson trên Android không?

Có, chọn Thư viện JSON là Gson để mọi tên đổi được gắn @SerializedName. Gson đọc trực tiếp vào trường nên kiểu POJO, Lombok hay record đều dùng được, record cần Gson 2.10 trở lên. Nếu bật R8 hoặc ProGuard, nhớ giữ tên trường của các lớp model hoặc dùng @SerializedName cho mọi trường bằng ô Luôn gắn tên JSON.

Số tiền nên dùng double hay BigDecimal?

Nên dùng BigDecimal vì double là số dấu phẩy động nhị phân, cộng trừ nhiều lần sẽ lệch ở phần lẻ. Bật ô Số thực dùng BigDecimal để mọi số thực ra BigDecimal. Jackson và Gson đều đọc số JSON vào BigDecimal giữ đúng chữ số.

Chuỗi ngày tháng có được đổi sang LocalDateTime không?

Không, công cụ giữ String vì đọc kiểu java.time cần module jackson-datatype-jsr310 hoặc TypeAdapter cho Gson. Sau khi dự án đã đăng ký module, bạn đổi kiểu trường sang OffsetDateTime (chuỗi có múi giờ), LocalDateTime (không múi giờ) hoặc LocalDate (chỉ có ngày).

JSON gốc là một mảng thì đọc thế nào?

Khi JSON bắt đầu bằng mảng object, công cụ gộp các object thành lớp mang tên gốc. Với Jackson, đọc bằng new ObjectMapper().readValue(json, new TypeReference<List<Root>>() {}); với Gson dùng TypeToken. Chú thích đầu kết quả ghi sẵn câu lệnh này.

Vì sao lớp con là static class nằm trong lớp gốc?

Mỗi file Java chỉ có một lớp public cấp cao nhất, nên đặt lớp con bên trong giúp toàn bộ kết quả nằm trong một file. Lớp lồng nên là static để Jackson và Gson tạo được đối tượng mà không cần đối tượng của lớp ngoài. Bạn có thể tách ra file riêng nếu muốn, chỉ cần bỏ từ khóa static.

Có sinh enum cho trường trạng thái không?

Không. Trường như status với các giá trị "paid", "pending" vẫn ra String, vì một mẫu không cho biết đủ các giá trị có thể có. Nếu muốn enum, hãy khai báo enum và gắn @JsonProperty cho từng hằng khi tên khác giá trị JSON.

Dữ liệu dán vào có bị lưu hay gửi đi không?

Không. JSON được đọc và chuyển thành mã ngay trên trình duyệt, trang không gửi nội dung lên máy chủ và không lưu lại sau khi bạn đóng tab. Với dữ liệu nhạy cảm, bạn vẫn nên thay giá trị thật bằng giá trị mẫu cùng dạng.

Mã sinh ra có lỗi biên dịch không?

Công cụ đã xử lý các ca dễ gây lỗi: từ khóa Java làm tên trường, lớp lồng trùng tên lớp ngoài, thành phần record mang tên bị cấm như hashCode, toString, wait (được đổi thành hashCodeValue kèm @JsonProperty giữ khóa gốc), ký tự điều khiển trong chuỗi annotation (dùng mã bát phân thay cho \u vì Java đọc \u trước khi tách từ). Tuy vậy trang không chạy trình biên dịch Java, nên hãy build lại trong dự án. Lỗi thường gặp nhất sau khi dán là thiếu thư viện Jackson, Gson hoặc Lombok trong file build.

JSON to Java converter này khác gì JSON to Kotlin, JSON to C# và JSON to TypeScript?

Các trang dùng chung một cách suy kiểu từ mẫu JSON nhưng sinh mã cho ngôn ngữ khác nhau. Trang JSON to Java tập trung vào thứ chỉ Java có: POJO getter/setter, Lombok @Data, record Java 16+, kiểu nguyên thủy hay boxed, lớp lồng static trong một file. Ứng dụng Android viết bằng Kotlin nên dùng JSON to Kotlin để có data class và kiểu nullable có dấu ?, còn frontend dùng JSON to TypeScript để có interface.

Khóa tên eTag hay iPhone có vấn đề gì?

Với tên bắt đầu bằng một chữ thường rồi đến chữ hoa, getter getETag() làm Jackson suy ra tên thuộc tính là etag, lệch với trường eTag. Ở kiểu POJO, công cụ gắn @JsonProperty cả ở trường, getter và setter để chỉ còn một thuộc tính. Ở kiểu Lombok với Jackson, công cụ ghi chú thích để bạn kiểm tra lại.

Từ khóa liên quan

  • json to java
  • json to java object
  • json to java pojo
  • json to java pojo online
  • json to java class
  • json to java converter
  • json to java record
  • json sang java
  • chuyển json sang class java
  • json to pojo
  • json to pojo online
  • json to lombok
  • json to java lombok
  • jackson jsonproperty generator
  • gson serializedname generator
  • tạo class java từ json
  • json to java bean
  • json to java model
  • json to java class online
  • json to java spring boot
  • json to dto java
  • json to java android gson

Công cụ Developer Tools liên quan

.env Generator

Tạo file .env và .env.example cho dự án.

.gitignore Generator

Tạo .gitignore cho Node.js, Python, Java.

API Mock Generator

Tạo mock JSON data cho API testing.

API Response Formatter

Format và phân tích API response.

API Tester

Test REST API: GET, POST, PUT, DELETE.

Postman Alternative - API Testing Tool Online với Collections, Environment & File Upload

Postman Alternative miễn phí - Test APIs với Collections, Multiple Environments, Pre-request Scripts, Collection Runner, File Upload (form-data), Tests/Assertions, Code Generation (cURL, JS, Python, Node.js). Browser-based, không cần cài đặt. Save requests, export/import collections, auto-save history. Hỗ trợ Bearer Token, Basic Auth, API Key. Hoàn hảo cho API development và testing.

Swagger API Tester - Test API với OpenAPI/Swagger Spec & Authentication Online

Swagger API Tester miễn phí - Import OpenAPI/Swagger specification và test API endpoints với đầy đủ authentication (Bearer Token/JWT, Basic Auth, API Key). Hỗ trợ OpenAPI 3.0, Swagger 2.0, auto-parse endpoints, parameters, request body. Giao diện như Swagger UI với color-coded methods, grouped endpoints, real-time testing. Hoàn hảo cho API development, testing, debugging secured APIs.

Base Converter

Chuyển đổi Binary, Hex, Base32.

Base64 Encoder

Mã hóa/giải mã Base64.

Binary Converter

Chuyển đổi Decimal, Binary, Hex.

Box Shadow Generator

Tạo CSS box-shadow trực quan.

Chmod Calculator

Tính quyền file Linux.

Dịch vụ của Tấn Phát Digital

Đang xây sản phẩm và cần thêm người làm phần nặng?

Gói giải pháp doanh nghiệp

Nền tảng custom cho ngân hàng, y tế và sàn B2B, chuẩn ISO 27001, GDPR, PCI-DSS, SLA 99.99%.

Từ 50.000.000đXem chi tiết →

Dịch vụ phát triển Blockchain & Web3

Smart contract, dApp và NFT marketplace đa chuỗi, audit bảo mật đầy đủ trước khi lên mainnet.

Từ 50.000.000đXem chi tiết →

Dịch vụ thiết kế website tại Hồ Chí Minh

Website doanh nghiệp, bán hàng và đặt lịch, chuẩn SEO ngay từ cấu trúc, tốc độ tải dưới 3 giây.

Từ 5.000.000đXem chi tiết →

Dịch vụ thiết kế landing page

Trang đích riêng cho từng chiến dịch quảng cáo, tỷ lệ chuyển đổi 3–8%, bàn giao trong 5–21 ngày.

Từ 3.000.000đXem chi tiết →

Tư vấn và báo giá miễn phí trong 24 giờ. Xem toàn bộ dịch vụ

TAN PHATDIGITAL